diff --git a/UE5/Cpp/G3NTs/.editorconfig b/UE5/Cpp/G3NTs/.editorconfig new file mode 100644 index 0000000..fbec821 --- /dev/null +++ b/UE5/Cpp/G3NTs/.editorconfig @@ -0,0 +1,91 @@ +[*.{cpp,h}] + +# Naming convention rules (note: currently need to be ordered from more to less specific) + +cpp_naming_rule.aactor_prefixed.symbols = aactor_class +cpp_naming_rule.aactor_prefixed.style = aactor_style + +cpp_naming_rule.swidget_prefixed.symbols = swidget_class +cpp_naming_rule.swidget_prefixed.style = swidget_style + +cpp_naming_rule.uobject_prefixed.symbols = uobject_class +cpp_naming_rule.uobject_prefixed.style = uobject_style + +cpp_naming_rule.booleans_prefixed.symbols = boolean_vars +cpp_naming_rule.booleans_prefixed.style = boolean_style + +cpp_naming_rule.structs_prefixed.symbols = structs +cpp_naming_rule.structs_prefixed.style = unreal_engine_structs + +cpp_naming_rule.enums_prefixed.symbols = enums +cpp_naming_rule.enums_prefixed.style = unreal_engine_enums + +cpp_naming_rule.templates_prefixed.symbols = templates +cpp_naming_rule.templates_prefixed.style = unreal_engine_templates + +cpp_naming_rule.general_names.symbols = all_symbols +cpp_naming_rule.general_names.style = unreal_engine_default + +# Naming convention symbols + +cpp_naming_symbols.aactor_class.applicable_kinds = class +cpp_naming_symbols.aactor_class.applicable_type = AActor + +cpp_naming_symbols.swidget_class.applicable_kinds = class +cpp_naming_symbols.swidget_class.applicable_type = SWidget + +cpp_naming_symbols.uobject_class.applicable_kinds = class +cpp_naming_symbols.uobject_class.applicable_type = UObject + +cpp_naming_symbols.boolean_vars.applicable_kinds = local,parameter,field +cpp_naming_symbols.boolean_vars.applicable_type = bool + +cpp_naming_symbols.enums.applicable_kinds = enum + +cpp_naming_symbols.templates.applicable_kinds = template_class + +cpp_naming_symbols.structs.applicable_kinds = struct + +cpp_naming_symbols.all_symbols.applicable_kinds = * + +# Naming convention styles + +cpp_naming_style.unreal_engine_default.capitalization = pascal_case +cpp_naming_style.unreal_engine_default.required_prefix = +cpp_naming_style.unreal_engine_default.required_suffix = +cpp_naming_style.unreal_engine_default.word_separator = + +cpp_naming_style.unreal_engine_enums.capitalization = pascal_case +cpp_naming_style.unreal_engine_enums.required_prefix = E +cpp_naming_style.unreal_engine_enums.required_suffix = +cpp_naming_style.unreal_engine_enums.word_separator = + +cpp_naming_style.unreal_engine_templates.capitalization = pascal_case +cpp_naming_style.unreal_engine_templates.required_prefix = T +cpp_naming_style.unreal_engine_templates.required_suffix = +cpp_naming_style.unreal_engine_templates.word_separator = + +cpp_naming_style.unreal_engine_structs.capitalization = pascal_case +cpp_naming_style.unreal_engine_structs.required_prefix = F +cpp_naming_style.unreal_engine_structs.required_suffix = +cpp_naming_style.unreal_engine_structs.word_separator = + +cpp_naming_style.uobject_style.capitalization = pascal_case +cpp_naming_style.uobject_style.required_prefix = U +cpp_naming_style.uobject_style.required_suffix = +cpp_naming_style.uobject_style.word_separator = + +cpp_naming_style.aactor_style.capitalization = pascal_case +cpp_naming_style.aactor_style.required_prefix = A +cpp_naming_style.aactor_style.required_suffix = +cpp_naming_style.aactor_style.word_separator = + +cpp_naming_style.swidget_style.capitalization = pascal_case +cpp_naming_style.swidget_style.required_prefix = S +cpp_naming_style.swidget_style.required_suffix = +cpp_naming_style.swidget_style.word_separator = + +cpp_naming_style.boolean_style.capitalization = pascal_case +cpp_naming_style.boolean_style.required_prefix = b +cpp_naming_style.boolean_style.required_suffix = +cpp_naming_style.boolean_style.word_separator = \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/.gitattributes b/UE5/Cpp/G3NTs/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/UE5/Cpp/G3NTs/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/UE5/Cpp/G3NTs/.gitignore b/UE5/Cpp/G3NTs/.gitignore new file mode 100644 index 0000000..6582eaf --- /dev/null +++ b/UE5/Cpp/G3NTs/.gitignore @@ -0,0 +1,74 @@ +# Visual Studio 2015 user specific files +.vs/ + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +*.ipa + +# These project files can be generated by the engine +*.xcodeproj +*.xcworkspace +*.sln +*.suo +*.opensdf +*.sdf +*.VC.db +*.VC.opendb + +# Precompiled Assets +SourceArt/**/*.png +SourceArt/**/*.tga + +# Binary Files +Binaries/* +Plugins/*/Binaries/* + +# Builds +Build/* + +# Whitelist PakBlacklist-.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + +# Don't ignore icon files in Build +!Build/**/*.ico + +# Built data for maps +*_BuiltData.uasset + +# Configuration files generated by the Editor +Saved/* + +# Compiled source files for the engine to use +Intermediate/* +Plugins/*/Intermediate/* + +# Cache files for the editor to use +DerivedDataCache/* diff --git a/UE5/Cpp/G3NTs/.vsconfig b/UE5/Cpp/G3NTs/.vsconfig new file mode 100644 index 0000000..7f5f4b3 --- /dev/null +++ b/UE5/Cpp/G3NTs/.vsconfig @@ -0,0 +1,13 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.Net.Component.4.6.2.TargetingPack", + "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64", + "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", + "Microsoft.VisualStudio.Component.Windows10SDK.22621", + "Microsoft.VisualStudio.Workload.CoreEditor", + "Microsoft.VisualStudio.Workload.ManagedDesktop", + "Microsoft.VisualStudio.Workload.NativeDesktop", + "Microsoft.VisualStudio.Workload.NativeGame" + ] +} diff --git a/UE5/Cpp/G3NTs/Config/DefaultEditor.ini b/UE5/Cpp/G3NTs/Config/DefaultEditor.ini new file mode 100644 index 0000000..e731434 --- /dev/null +++ b/UE5/Cpp/G3NTs/Config/DefaultEditor.ini @@ -0,0 +1,11 @@ +[UnrealEd.SimpleMap] +SimpleMapName=/Game/FirstPerson/Maps/FirstPersonExampleMap + +[EditoronlyBP] +bAllowClassAndBlueprintPinMatching=true +bReplaceBlueprintWithClass= true +bDontLoadBlueprintOutsideEditor= true +bBlueprintIsNotBlueprintType= true + +[/Script/AdvancedPreviewScene.SharedProfiles] + diff --git a/UE5/Cpp/G3NTs/Config/DefaultEditorPerProjectUserSettings.ini b/UE5/Cpp/G3NTs/Config/DefaultEditorPerProjectUserSettings.ini new file mode 100644 index 0000000..220a551 --- /dev/null +++ b/UE5/Cpp/G3NTs/Config/DefaultEditorPerProjectUserSettings.ini @@ -0,0 +1,2 @@ +[ContentBrowser] +ContentBrowserTab1.SelectedPaths=/Game/FirstPerson \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Config/DefaultEngine.ini b/UE5/Cpp/G3NTs/Config/DefaultEngine.ini new file mode 100644 index 0000000..92244c1 --- /dev/null +++ b/UE5/Cpp/G3NTs/Config/DefaultEngine.ini @@ -0,0 +1,170 @@ +[/Script/Engine.CollisionProfile] +-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False) +-Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) +-Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ",bCanModify=False) +-Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ",bCanModify=False) +-Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic",Response=ECR_Block),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.",bCanModify=False) +-Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors",bCanModify=False) +-Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors",bCanModify=False) +-Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.",bCanModify=False) +-Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.",bCanModify=False) +-Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.",bCanModify=False) +-Profiles=(Name="UI",CollisionEnabled=QueryOnly,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Block),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ",bCanModify=False) ++Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision") ++Profiles=(Name="BlockAll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=,HelpMessage="WorldStatic object that blocks all actors by default. All new custom channels will use its own default response. ") ++Profiles=(Name="OverlapAll",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ") ++Profiles=(Name="BlockAllDynamic",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=,HelpMessage="WorldDynamic object that blocks all actors by default. All new custom channels will use its own default response. ") ++Profiles=(Name="OverlapAllDynamic",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Overlap),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that overlaps all actors by default. All new custom channels will use its own default response. ") ++Profiles=(Name="IgnoreOnlyPawn",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that ignores Pawn and Vehicle. All other channels will be set to default.") ++Profiles=(Name="OverlapOnlyPawn",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Pawn",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that overlaps Pawn, Camera, and Vehicle. All other channels will be set to default. ") ++Profiles=(Name="Pawn",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object. Can be used for capsule of any playerable character or AI. ") ++Profiles=(Name="Spectator",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="WorldStatic"),(Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="PhysicsBody",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Pawn object that ignores all other actors except WorldStatic.") ++Profiles=(Name="CharacterMesh",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="Pawn",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Pawn object that is used for Character Mesh. All other channels will be set to default.") ++Profiles=(Name="PhysicsActor",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=,HelpMessage="Simulating actors") ++Profiles=(Name="Destructible",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Destructible",CustomResponses=,HelpMessage="Destructible actors") ++Profiles=(Name="InvisibleWall",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldStatic object that is invisible.") ++Profiles=(Name="InvisibleWallDynamic",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="WorldDynamic object that is invisible.") ++Profiles=(Name="Trigger",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldDynamic object that is used for trigger. All other channels will be set to default.") ++Profiles=(Name="Ragdoll",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="PhysicsBody",CustomResponses=((Channel="Pawn",Response=ECR_Ignore),(Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Simulating Skeletal Mesh Component. All other channels will be set to default.") ++Profiles=(Name="Vehicle",CollisionEnabled=QueryAndPhysics,bCanModify=False,ObjectTypeName="Vehicle",CustomResponses=,HelpMessage="Vehicle object that blocks Vehicle, WorldStatic, and WorldDynamic. All other channels will be set to default.") ++Profiles=(Name="UI",CollisionEnabled=QueryOnly,bCanModify=False,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="WorldStatic",Response=ECR_Overlap),(Channel="Pawn",Response=ECR_Overlap),(Channel="Visibility"),(Channel="WorldDynamic",Response=ECR_Overlap),(Channel="Camera",Response=ECR_Overlap),(Channel="PhysicsBody",Response=ECR_Overlap),(Channel="Vehicle",Response=ECR_Overlap),(Channel="Destructible",Response=ECR_Overlap)),HelpMessage="WorldStatic object that overlaps all actors by default. All new custom channels will use its own default response. ") ++Profiles=(Name="Projectile",CollisionEnabled=QueryOnly,bCanModify=True,ObjectTypeName="Projectile",CustomResponses=,HelpMessage="Preset for projectiles") ++Profiles=(Name="PortalAgent",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="PortalAgent",CustomResponses=((Channel="Visibility",Response=ECR_Ignore)),HelpMessage="Needs description") ++Profiles=(Name="PortalCollisionObject",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="PortalCollisionObject",CustomResponses=((Channel="PortalAgent",Response=ECR_Ignore)),HelpMessage="Needs description") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="Projectile") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="PortalSurface") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="PortalBullet") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel4,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="PortalAgent") ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel5,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="PortalCollisionObject") ++EditProfiles=(Name="Trigger",CustomResponses=((Channel="Projectile",Response=ECR_Ignore),(Channel="PortalSurface",Response=ECR_Overlap),(Channel="PortalBullet",Response=ECR_Overlap),(Channel="PortalAgent",Response=ECR_Overlap),(Channel="PortalCollisionObject",Response=ECR_Overlap))) ++EditProfiles=(Name="OverlapAll",CustomResponses=((Channel="Projectile",Response=ECR_Overlap),(Channel="PortalSurface",Response=ECR_Overlap),(Channel="PortalBullet",Response=ECR_Overlap),(Channel="PortalAgent",Response=ECR_Overlap),(Channel="PortalCollisionObject",Response=ECR_Overlap))) ++EditProfiles=(Name="Spectator",CustomResponses=((Channel="Projectile",Response=ECR_Ignore),(Channel="PortalSurface",Response=ECR_Ignore),(Channel="PortalBullet",Response=ECR_Ignore),(Channel="PortalAgent",Response=ECR_Ignore),(Channel="PortalCollisionObject",Response=ECR_Ignore))) ++EditProfiles=(Name="UI",CustomResponses=((Channel="Projectile",Response=ECR_Overlap),(Channel="PortalSurface",Response=ECR_Overlap),(Channel="PortalBullet",Response=ECR_Overlap),(Channel="PortalAgent",Response=ECR_Overlap),(Channel="PortalCollisionObject",Response=ECR_Overlap))) +-ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall") +-ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn") +-ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic") +-ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor") +-ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic") ++ProfileRedirects=(OldName="BlockingVolume",NewName="InvisibleWall") ++ProfileRedirects=(OldName="InterpActor",NewName="IgnoreOnlyPawn") ++ProfileRedirects=(OldName="StaticMeshComponent",NewName="BlockAllDynamic") ++ProfileRedirects=(OldName="SkeletalMeshActor",NewName="PhysicsActor") ++ProfileRedirects=(OldName="InvisibleActor",NewName="InvisibleWallDynamic") +-CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic") +-CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic") +-CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle") +-CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn") ++CollisionChannelRedirects=(OldName="Static",NewName="WorldStatic") ++CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic") ++CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle") ++CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn") + +[/Script/EngineSettings.GameMapsSettings] +EditorStartupMap=/Game/FirstPerson/Maps/FirstPersonMap.FirstPersonMap +LocalMapOptions= +TransitionMap= +bUseSplitscreen=True +TwoPlayerSplitscreenLayout=Horizontal +ThreePlayerSplitscreenLayout=FavorTop +GameInstanceClass=/Script/Engine.GameInstance +GameDefaultMap=/Game/FirstPerson/Maps/FirstPersonMap.FirstPersonMap +ServerDefaultMap=/Engine/Maps/Entry +GlobalDefaultGameMode=/Game/FirstPerson/Blueprints/BP_FirstPersonGameMode.BP_FirstPersonGameMode_C +GlobalDefaultServerGameMode=None + +[/Script/Engine.RendererSettings] +r.ReflectionMethod=0 +r.GenerateMeshDistanceFields=True +r.DynamicGlobalIlluminationMethod=0 +r.Mobile.EnableNoPrecomputedLightingCSMShader=1 +r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True +r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=true + + +r.Shadow.Virtual.Enable=0 + +r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 + +r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 +r.AllowGlobalClipPlane=True +r.AntiAliasingMethod=1 +r.DefaultFeature.MotionBlur=False +r.DefaultFeature.AutoExposure=True +r.CustomDepth=3 +r.AllowOcclusionQueries=False + +[/Script/WindowsTargetPlatform.WindowsTargetSettings] +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +-D3D12TargetedShaderFormats=PCD3D_SM5 ++D3D12TargetedShaderFormats=PCD3D_SM6 +-D3D11TargetedShaderFormats=PCD3D_SM5 ++D3D11TargetedShaderFormats=PCD3D_SM5 +Compiler=VisualStudio2022 +AudioSampleRate=48000 +AudioCallbackBufferFrameSize=1024 +AudioNumBuffersToEnqueue=1 +AudioMaxChannels=0 +AudioNumSourceWorkers=4 +SpatializationPlugin= +SourceDataOverridePlugin= +ReverbPlugin= +OcclusionPlugin= +CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0) +CacheSizeKB=65536 +MaxChunkSizeOverrideKB=0 +bResampleForDevice=False +MaxSampleRate=48000.000000 +HighSampleRate=32000.000000 +MedSampleRate=24000.000000 +LowSampleRate=12000.000000 +MinSampleRate=8000.000000 +CompressionQualityModifier=1.000000 +AutoStreamingThreshold=0.000000 +SoundCueCookQualityIndex=-1 + +[/Script/LinuxTargetPlatform.LinuxTargetSettings] +-TargetedRHIs=SF_VULKAN_SM5 ++TargetedRHIs=SF_VULKAN_SM6 + + +[/Script/HardwareTargeting.HardwareTargetingSettings] +TargetedHardwareClass=Desktop +AppliedTargetedHardwareClass=Desktop +DefaultGraphicsPerformance=Maximum +AppliedDefaultGraphicsPerformance=Maximum + +[/Script/Engine.Engine] ++ActiveGameNameRedirects=(OldGameName="TP_FirstPerson",NewGameName="/Script/Portal2") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_FirstPerson",NewGameName="/Script/Portal2") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonProjectile",NewClassName="Portal2Projectile") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonPlayerController",NewClassName="Portal2PlayerController") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonGameMode",NewClassName="Portal2GameMode") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonCharacter",NewClassName="Portal2Character") +NearClipPlane=1.000000 +bUseFixedFrameRate=False +FixedFrameRate=120.000000 +MinDesiredFrameRate=60.000000 +bSmoothFrameRate=True +SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=35.000000),UpperBound=(Type=Exclusive,Value=120.000000)) + +[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings] +bEnablePlugin=True +bAllowNetworkConnection=True +SecurityToken=7BE8E20D49266768401DB1B80B2CAABE +bIncludeInShipping=False +bAllowExternalStartInShipping=False +bCompileAFSProject=False +bUseCompression=False +bLogFiles=False +bReportStats=False +ConnectionType=USBOnly +bUseManualIPAddress=False +ManualIPAddress= + diff --git a/UE5/Cpp/G3NTs/Config/DefaultGame.ini b/UE5/Cpp/G3NTs/Config/DefaultGame.ini new file mode 100644 index 0000000..6d00ad2 --- /dev/null +++ b/UE5/Cpp/G3NTs/Config/DefaultGame.ini @@ -0,0 +1,25 @@ +[ProjectSettings] +ProjectID=(A=1823396784,B=1298598689,C=1743498150,D=-2048051708) +ProjectName=First Person Template + +[/Script/EngineSettings.GeneralProjectSettings] +ProjectID=54591E6C4893BE0B37BD2F93CCE44739 +FOVForFakeStereoRenderingDevice=90.000000 +CompanyName=Dobro +CompanyDistinguishedName=Dobro +Homepage=Dobro +SupportContact=Dobro +ProjectName=Portal Demo +Description=A game demo of portals + +[StartupActions] +bAddPacks=True +InsertPack=(PackSource="StarterContent.upack",PackName="StarterContent") + +[SectionsToSave] ++Section=StartupActions + +[/Script/UnrealEd.ProjectPackagingSettings] +BuildConfiguration=PPBC_Shipping +FullRebuild=False + diff --git a/UE5/Cpp/G3NTs/Config/DefaultInput.ini b/UE5/Cpp/G3NTs/Config/DefaultInput.ini new file mode 100644 index 0000000..0d0b0e5 --- /dev/null +++ b/UE5/Cpp/G3NTs/Config/DefaultInput.ini @@ -0,0 +1,109 @@ +[/Script/Engine.InputSettings] +-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) ++AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Touch",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbRest",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbRest",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_ThumbPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_IndexPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_MiddlePinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_RingPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_PinkPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_ThumbPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_IndexPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_MiddlePinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_RingPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_PinkPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +bAltEnterTogglesFullscreen=True +bF11TogglesFullscreen=True +bUseMouseForTouch=False +bEnableMouseSmoothing=True +bEnableFOVScaling=True +bCaptureMouseOnLaunch=True +bEnableLegacyInputScales=True +bEnableMotionControls=True +bFilterInputByPlatformUser=False +bShouldFlushPressedKeysOnViewportFocusLost=True +bAlwaysShowTouchInterface=False +bShowConsoleOnFourFingerTap=True +bEnableGestureRecognizer=False +bUseAutocorrect=False +DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown +DefaultViewportMouseLockMode=LockOnCapture +FOVScale=0.011110 +DoubleClickTime=0.200000 +DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput +DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent +DefaultTouchInterface=/Game/FirstPerson/Input/MobileControls.MobileControls +-ConsoleKeys=Tilde ++ConsoleKeys=Tilde + diff --git a/UE5/Cpp/G3NTs/Config/DefaultNiagara.ini b/UE5/Cpp/G3NTs/Config/DefaultNiagara.ini new file mode 100644 index 0000000..94a76c4 --- /dev/null +++ b/UE5/Cpp/G3NTs/Config/DefaultNiagara.ini @@ -0,0 +1,5 @@ + + +[/Script/Niagara.NiagaraSettings] +NDIStaticMesh_AllowDistanceFields=False + diff --git a/UE5/Cpp/G3NTs/Content/BP_BoxDissolve.uasset b/UE5/Cpp/G3NTs/Content/BP_BoxDissolve.uasset new file mode 100644 index 0000000..05a2a3b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_BoxDissolve.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_Cube.uasset b/UE5/Cpp/G3NTs/Content/BP_Cube.uasset new file mode 100644 index 0000000..84c88d5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_Cube.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_Cursor.uasset b/UE5/Cpp/G3NTs/Content/BP_Cursor.uasset new file mode 100644 index 0000000..c276e30 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_Cursor.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_Portal3Manager.uasset b/UE5/Cpp/G3NTs/Content/BP_Portal3Manager.uasset new file mode 100644 index 0000000..00ef873 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_Portal3Manager.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_PortalBullet.uasset b/UE5/Cpp/G3NTs/Content/BP_PortalBullet.uasset new file mode 100644 index 0000000..f0db692 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_PortalBullet.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_PortalBullet_Blue.uasset b/UE5/Cpp/G3NTs/Content/BP_PortalBullet_Blue.uasset new file mode 100644 index 0000000..8d54c29 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_PortalBullet_Blue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_PortalBullet_Orange.uasset b/UE5/Cpp/G3NTs/Content/BP_PortalBullet_Orange.uasset new file mode 100644 index 0000000..27f5894 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_PortalBullet_Orange.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BP_PortalV3.uasset b/UE5/Cpp/G3NTs/Content/BP_PortalV3.uasset new file mode 100644 index 0000000..8232b71 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BP_PortalV3.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Barrier.uasset b/UE5/Cpp/G3NTs/Content/Barrier.uasset new file mode 100644 index 0000000..267c069 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Barrier.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Barrier_Inst.uasset b/UE5/Cpp/G3NTs/Content/Barrier_Inst.uasset new file mode 100644 index 0000000..776a4f8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Barrier_Inst.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BoxDissolve.uasset b/UE5/Cpp/G3NTs/Content/BoxDissolve.uasset new file mode 100644 index 0000000..b17f075 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BoxDissolve.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/BoxDissolve_Inst.uasset b/UE5/Cpp/G3NTs/Content/BoxDissolve_Inst.uasset new file mode 100644 index 0000000..65e1f75 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/BoxDissolve_Inst.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Cursor.uasset b/UE5/Cpp/G3NTs/Content/Cursor.uasset new file mode 100644 index 0000000..49e1bbc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Cursor.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Audio/FirstPersonTemplateWeaponFire02.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Audio/FirstPersonTemplateWeaponFire02.uasset new file mode 100644 index 0000000..fc187ea Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Audio/FirstPersonTemplateWeaponFire02.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/BaseMaterial.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/BaseMaterial.uasset new file mode 100644 index 0000000..aafda1d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/BaseMaterial.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/FirstPersonProjectileMaterial.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/FirstPersonProjectileMaterial.uasset new file mode 100644 index 0000000..590222f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/FirstPersonProjectileMaterial.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/M_FPGun.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/M_FPGun.uasset new file mode 100644 index 0000000..8aaafe1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/M_FPGun.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset new file mode 100644 index 0000000..c6436a2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset new file mode 100644 index 0000000..c3124ee Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_Screen.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_Screen.uasset new file mode 100644 index 0000000..a93197f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_Screen.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset new file mode 100644 index 0000000..1fbfe3e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Aluminum01.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Aluminum01.uasset new file mode 100644 index 0000000..abb5c8f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Aluminum01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset new file mode 100644 index 0000000..91bfa7b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_FineRubber.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_FineRubber.uasset new file mode 100644 index 0000000..809ab90 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_FineRubber.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset new file mode 100644 index 0000000..9003b8a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset new file mode 100644 index 0000000..7b8f783 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/FirstPersonProjectileMesh.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/FirstPersonProjectileMesh.uasset new file mode 100644 index 0000000..2fd90d6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/FirstPersonProjectileMesh.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun.uasset new file mode 100644 index 0000000..5355b9b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_Physics.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_Physics.uasset new file mode 100644 index 0000000..a5c2ad8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_Physics.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_PhysicsAsset.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_PhysicsAsset.uasset new file mode 100644 index 0000000..45fe584 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_PhysicsAsset.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset new file mode 100644 index 0000000..74c94d5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Mesh/SK_FPGun_Skeleton.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Textures/T_FPGun_M.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Textures/T_FPGun_M.uasset new file mode 100644 index 0000000..62349ed Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Textures/T_FPGun_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FPWeapon/Textures/T_FPGun_N.uasset b/UE5/Cpp/G3NTs/Content/FPWeapon/Textures/T_FPGun_N.uasset new file mode 100644 index 0000000..82db14c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FPWeapon/Textures/T_FPGun_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset new file mode 100644 index 0000000..0b98261 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonGameMode.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonGameMode.uasset new file mode 100644 index 0000000..62d169f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonGameMode.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonPlayerController.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonPlayerController.uasset new file mode 100644 index 0000000..0c84158 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonPlayerController.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonProjectile.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonProjectile.uasset new file mode 100644 index 0000000..41b779a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_FirstPersonProjectile.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_PickUp_Rifle.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_PickUp_Rifle.uasset new file mode 100644 index 0000000..6f8c26a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Blueprints/BP_PickUp_Rifle.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Change_Gun.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Change_Gun.uasset new file mode 100644 index 0000000..f9fb672 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Change_Gun.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Jump.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Jump.uasset new file mode 100644 index 0000000..9201295 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Jump.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Look.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Look.uasset new file mode 100644 index 0000000..b6b818a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Look.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Move.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Move.uasset new file mode 100644 index 0000000..51bd8d3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Move.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Shoot_Left.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Shoot_Left.uasset new file mode 100644 index 0000000..0c1470d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Shoot_Left.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Shoot_Right.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Shoot_Right.uasset new file mode 100644 index 0000000..3a992b5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/Actions/IA_Shoot_Right.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/IMC_Default.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/IMC_Default.uasset new file mode 100644 index 0000000..3e8d71b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/IMC_Default.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/IMC_Weapons.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/IMC_Weapons.uasset new file mode 100644 index 0000000..124c0e4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/IMC_Weapons.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Input/MobileControls.uasset b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/MobileControls.uasset new file mode 100644 index 0000000..1ec494b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Input/MobileControls.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPerson/Maps/FirstPersonMap.umap b/UE5/Cpp/G3NTs/Content/FirstPerson/Maps/FirstPersonMap.umap new file mode 100644 index 0000000..f9c99e9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPerson/Maps/FirstPersonMap.umap differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Falling.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Falling.uasset new file mode 100644 index 0000000..e794510 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Falling.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Idle.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Idle.uasset new file mode 100644 index 0000000..019b8e7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Idle.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Jump.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Jump.uasset new file mode 100644 index 0000000..11e7634 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Jump.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Land.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Land.uasset new file mode 100644 index 0000000..562be0a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Land.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Falling.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Falling.uasset new file mode 100644 index 0000000..0c33c78 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Falling.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Fire.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Fire.uasset new file mode 100644 index 0000000..286d2c7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Fire.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Idle.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Idle.uasset new file mode 100644 index 0000000..46d80cf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Idle.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Jump.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Jump.uasset new file mode 100644 index 0000000..6393742 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Jump.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Land.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Land.uasset new file mode 100644 index 0000000..05ccc7d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Land.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Run.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Run.uasset new file mode 100644 index 0000000..3bf7baf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Run.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Shoot_Montage.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Shoot_Montage.uasset new file mode 100644 index 0000000..db54723 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Rifle_Shoot_Montage.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Run_Fwd.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Run_Fwd.uasset new file mode 100644 index 0000000..ac4400c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FP_Run_Fwd.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FirstPerson_AnimBP.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FirstPerson_AnimBP.uasset new file mode 100644 index 0000000..b0014d6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Animations/FirstPerson_AnimBP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/CA_Mannequin.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/CA_Mannequin.uasset new file mode 100644 index 0000000..d1c8f07 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/CA_Mannequin.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/ChromaticCurve.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/ChromaticCurve.uasset new file mode 100644 index 0000000..4e4aa79 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/ChromaticCurve.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/MF_Diffraction.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/MF_Diffraction.uasset new file mode 100644 index 0000000..7f5e7c6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/MF_Diffraction.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/MF_logo3layers.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/MF_logo3layers.uasset new file mode 100644 index 0000000..13b36fb Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/MF_logo3layers.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/ML_BaseColorFallOff.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/ML_BaseColorFallOff.uasset new file mode 100644 index 0000000..d061fc2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Functions/ML_BaseColorFallOff.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Instances/Manny/MI_Manny_01.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Instances/Manny/MI_Manny_01.uasset new file mode 100644 index 0000000..168b822 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Instances/Manny/MI_Manny_01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Instances/Manny/MI_Manny_02.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Instances/Manny/MI_Manny_02.uasset new file mode 100644 index 0000000..56dcb9e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/Instances/Manny/MI_Manny_02.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/M_Mannequin.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/M_Mannequin.uasset new file mode 100644 index 0000000..7437baf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Materials/M_Mannequin.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms.uasset new file mode 100644 index 0000000..a06ab61 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_PhysicsAsset.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_PhysicsAsset.uasset new file mode 100644 index 0000000..204f1f0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_PhysicsAsset.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset new file mode 100644 index 0000000..0e893ec Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms_Skeleton.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_ASAOPMASK_MSK.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_ASAOPMASK_MSK.uasset new file mode 100644 index 0000000..d0a8410 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_ASAOPMASK_MSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_BN.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_BN.uasset new file mode 100644 index 0000000..0c29012 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_BN.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_CCRCCPlastic_MSK.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_CCRCCPlastic_MSK.uasset new file mode 100644 index 0000000..9998bef Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_CCRCCPlastic_MSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_D.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_D.uasset new file mode 100644 index 0000000..28cff0c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_MSR_MSK.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_MSR_MSK.uasset new file mode 100644 index 0000000..1a6eb0c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_MSR_MSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_N.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_N.uasset new file mode 100644 index 0000000..d8451ac Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_Tan.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_Tan.uasset new file mode 100644 index 0000000..67202b5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_01_Tan.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_ASAOPMASK_MSK.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_ASAOPMASK_MSK.uasset new file mode 100644 index 0000000..0367acc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_ASAOPMASK_MSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_BN.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_BN.uasset new file mode 100644 index 0000000..6b9a723 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_BN.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_CCRCCPlastic_MSK.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_CCRCCPlastic_MSK.uasset new file mode 100644 index 0000000..c30481b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_CCRCCPlastic_MSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_D.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_D.uasset new file mode 100644 index 0000000..e0b3c82 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_MSR_MSK.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_MSR_MSK.uasset new file mode 100644 index 0000000..b6b921a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_MSR_MSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_N.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_N.uasset new file mode 100644 index 0000000..3ba7dec Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_Tan.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_Tan.uasset new file mode 100644 index 0000000..2ab4d61 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Manny/T_Manny_02_Tan.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Shared/T_UE_Logo_M.uasset b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Shared/T_UE_Logo_M.uasset new file mode 100644 index 0000000..30213c8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/FirstPersonArms/Character/Textures/Shared/T_UE_Logo_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset new file mode 100644 index 0000000..84dde04 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset new file mode 100644 index 0000000..4605682 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset new file mode 100644 index 0000000..2accd35 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset new file mode 100644 index 0000000..bc39915 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_Solid_Blue.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_Solid_Blue.uasset new file mode 100644 index 0000000..7b7ad88 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_Solid_Blue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_Solid_Red.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_Solid_Red.uasset new file mode 100644 index 0000000..ceb87bb Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/MI_Solid_Red.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset new file mode 100644 index 0000000..f61487d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_Dark.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_Dark.uasset new file mode 100644 index 0000000..17926fb Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_Dark.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_Dark_ICe.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_Dark_ICe.uasset new file mode 100644 index 0000000..25639e0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_Dark_ICe.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_White.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_White.uasset new file mode 100644 index 0000000..52e2009 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_White.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_White_Top.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_White_Top.uasset new file mode 100644 index 0000000..5c226b4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_PrototypeGrid_White_Top.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_Solid.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_Solid.uasset new file mode 100644 index 0000000..84f5b14 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Materials/M_Solid.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset new file mode 100644 index 0000000..fe6da62 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Cube.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Cube.uasset new file mode 100644 index 0000000..0e7d2a3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Cube.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset new file mode 100644 index 0000000..2dc5fab Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset new file mode 100644 index 0000000..cbd952c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Ramp.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Ramp.uasset new file mode 100644 index 0000000..f1f05c6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/SM_Ramp.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/Shape_Plane.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/Shape_Plane.uasset new file mode 100644 index 0000000..44ed285 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Meshes/Shape_Plane.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset new file mode 100644 index 0000000..e901d24 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/PC_BoxData.uasset b/UE5/Cpp/G3NTs/Content/PC_BoxData.uasset new file mode 100644 index 0000000..f75a119 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/PC_BoxData.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/PortalBullet.uasset b/UE5/Cpp/G3NTs/Content/PortalBullet.uasset new file mode 100644 index 0000000..f42f828 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/PortalBullet.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/PortalBulletCenter.uasset b/UE5/Cpp/G3NTs/Content/PortalBulletCenter.uasset new file mode 100644 index 0000000..57f04ca Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/PortalBulletCenter.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/PortalBulletParticleSystem.uasset b/UE5/Cpp/G3NTs/Content/PortalBulletParticleSystem.uasset new file mode 100644 index 0000000..f6bd760 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/PortalBulletParticleSystem.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/PortalBulletParticleSystem2.uasset b/UE5/Cpp/G3NTs/Content/PortalBulletParticleSystem2.uasset new file mode 100644 index 0000000..a648a46 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/PortalBulletParticleSystem2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/PortalSurfaceDynamic.uasset b/UE5/Cpp/G3NTs/Content/PortalSurfaceDynamic.uasset new file mode 100644 index 0000000..50cbe9b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/PortalSurfaceDynamic.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Portal_Material.uasset b/UE5/Cpp/G3NTs/Content/Portal_Material.uasset new file mode 100644 index 0000000..47cafc1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Portal_Material.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Portal_Material1.uasset b/UE5/Cpp/G3NTs/Content/Portal_Material1.uasset new file mode 100644 index 0000000..86001a3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Portal_Material1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Portal_Material1_Inst.uasset b/UE5/Cpp/G3NTs/Content/Portal_Material1_Inst.uasset new file mode 100644 index 0000000..039102a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Portal_Material1_Inst.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/Splash/EdSplash.png b/UE5/Cpp/G3NTs/Content/Splash/EdSplash.png new file mode 100644 index 0000000..b158ef0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Splash/EdSplash.png differ diff --git a/UE5/Cpp/G3NTs/Content/Splash/Splash.png b/UE5/Cpp/G3NTs/Content/Splash/Splash.png new file mode 100644 index 0000000..b158ef0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/Splash/Splash.png differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Floor_400x400.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Floor_400x400.uasset new file mode 100644 index 0000000..8f12123 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Floor_400x400.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Pillar_50x500.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Pillar_50x500.uasset new file mode 100644 index 0000000..46aed7d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Pillar_50x500.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/SM_AssetPlatform.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/SM_AssetPlatform.uasset new file mode 100644 index 0000000..1f0f0be Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/SM_AssetPlatform.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x200.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x200.uasset new file mode 100644 index 0000000..a7aeff7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x200.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x300.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x300.uasset new file mode 100644 index 0000000..959fd41 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x300.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x400.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x400.uasset new file mode 100644 index 0000000..9ad5e36 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_400x400.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_500x500.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_500x500.uasset new file mode 100644 index 0000000..96e5e9b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_500x500.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Door_400x300.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Door_400x300.uasset new file mode 100644 index 0000000..8b60b28 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Door_400x300.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Door_400x400.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Door_400x400.uasset new file mode 100644 index 0000000..55b60cb Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Door_400x400.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Window_400x300.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Window_400x300.uasset new file mode 100644 index 0000000..cb91768 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Window_400x300.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Window_400x400.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Window_400x400.uasset new file mode 100644 index 0000000..1d2259d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Architecture/Wall_Window_400x400.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse01.uasset new file mode 100644 index 0000000..9c68be4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse02.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse02.uasset new file mode 100644 index 0000000..5bd3fec Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse02.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse_Cue.uasset new file mode 100644 index 0000000..4548e1e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Collapse_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion01.uasset new file mode 100644 index 0000000..2ec32d8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion02.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion02.uasset new file mode 100644 index 0000000..98174ab Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion02.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion_Cue.uasset new file mode 100644 index 0000000..7984faf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Explosion_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire01.uasset new file mode 100644 index 0000000..0c495f4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire01_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire01_Cue.uasset new file mode 100644 index 0000000..86861b6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire01_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire_Sparks01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire_Sparks01.uasset new file mode 100644 index 0000000..1479dad Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire_Sparks01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire_Sparks01_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire_Sparks01_Cue.uasset new file mode 100644 index 0000000..f93b729 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Fire_Sparks01_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light01.uasset new file mode 100644 index 0000000..8e02bab Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light01_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light01_Cue.uasset new file mode 100644 index 0000000..a165870 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light01_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light02.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light02.uasset new file mode 100644 index 0000000..907cd0e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light02.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light02_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light02_Cue.uasset new file mode 100644 index 0000000..1a63569 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Light02_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Smoke01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Smoke01.uasset new file mode 100644 index 0000000..023a555 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Smoke01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Smoke01_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Smoke01_Cue.uasset new file mode 100644 index 0000000..b7d7bad Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Smoke01_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Background_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Background_Cue.uasset new file mode 100644 index 0000000..fc9649f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Background_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Birds01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Birds01.uasset new file mode 100644 index 0000000..900fc5e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Birds01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Music01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Music01.uasset new file mode 100644 index 0000000..d404003 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Music01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Music_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Music_Cue.uasset new file mode 100644 index 0000000..1bba60d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Music_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Wind05.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Wind05.uasset new file mode 100644 index 0000000..36bf8d9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Wind05.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Wind06.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Wind06.uasset new file mode 100644 index 0000000..0867c74 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Starter_Wind06.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Steam01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Steam01.uasset new file mode 100644 index 0000000..a1ee8a7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Steam01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Steam01_Cue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Steam01_Cue.uasset new file mode 100644 index 0000000..2ef161f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Audio/Steam01_Cue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/FogBrightnessLUT.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/FogBrightnessLUT.uasset new file mode 100644 index 0000000..6babc5b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/FogBrightnessLUT.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Arrows.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Arrows.uasset new file mode 100644 index 0000000..55151f5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Arrows.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_Black.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_Black.uasset new file mode 100644 index 0000000..1e8f009 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_Black.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_HDRI.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_HDRI.uasset new file mode 100644 index 0000000..c81172b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_HDRI.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_Master.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_Master.uasset new file mode 100644 index 0000000..e47d5e0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/M_LightStage_Skybox_Master.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/SM_Arrows.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/SM_Arrows.uasset new file mode 100644 index 0000000..94e6203 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/SM_Arrows.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/Skybox.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/Skybox.uasset new file mode 100644 index 0000000..54dc67a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/Skybox.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/SunlightColorLUT.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/SunlightColorLUT.uasset new file mode 100644 index 0000000..e2c3765 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Assets/SunlightColorLUT.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/BP_LightStudio.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/BP_LightStudio.uasset new file mode 100644 index 0000000..b85ba86 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/BP_LightStudio.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_CeilingLight.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_CeilingLight.uasset new file mode 100644 index 0000000..b5b40a2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_CeilingLight.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Explosion.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Explosion.uasset new file mode 100644 index 0000000..3e92029 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Explosion.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Fire.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Fire.uasset new file mode 100644 index 0000000..a0c45b8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Fire.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Smoke.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Smoke.uasset new file mode 100644 index 0000000..bb648c9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Smoke.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Sparks.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Sparks.uasset new file mode 100644 index 0000000..1c27dc4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Sparks.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Steam.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Steam.uasset new file mode 100644 index 0000000..45417c8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_Effect_Steam.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_WallSconce.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_WallSconce.uasset new file mode 100644 index 0000000..3f29873 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Blueprints/Blueprint_WallSconce.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset new file mode 100644 index 0000000..9b1f1be Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Maps/Advanced_Lighting.umap b/UE5/Cpp/G3NTs/Content/StarterContent/Maps/Advanced_Lighting.umap new file mode 100644 index 0000000..ebf6966 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Maps/Advanced_Lighting.umap differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Maps/Minimal_Default.umap b/UE5/Cpp/G3NTs/Content/StarterContent/Maps/Minimal_Default.umap new file mode 100644 index 0000000..378270c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Maps/Minimal_Default.umap differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Maps/StarterMap.umap b/UE5/Cpp/G3NTs/Content/StarterContent/Maps/StarterMap.umap new file mode 100644 index 0000000..3d55147 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Maps/StarterMap.umap differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_AssetPlatform.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_AssetPlatform.uasset new file mode 100644 index 0000000..4962777 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_AssetPlatform.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Basic_Floor.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Basic_Floor.uasset new file mode 100644 index 0000000..6b05cb4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Basic_Floor.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Basic_Wall.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Basic_Wall.uasset new file mode 100644 index 0000000..dd5ae24 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Basic_Wall.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_Beveled.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_Beveled.uasset new file mode 100644 index 0000000..2b8a349 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_Beveled.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_New.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_New.uasset new file mode 100644 index 0000000..e519245 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_New.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_Old.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_Old.uasset new file mode 100644 index 0000000..bd49323 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Clay_Old.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Cut_Stone.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Cut_Stone.uasset new file mode 100644 index 0000000..2ff69bc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Cut_Stone.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Hewn_Stone.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Hewn_Stone.uasset new file mode 100644 index 0000000..d1d7e67 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Brick_Hewn_Stone.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ceramic_Tile_Checker.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ceramic_Tile_Checker.uasset new file mode 100644 index 0000000..e5f0590 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ceramic_Tile_Checker.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Pebble.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Pebble.uasset new file mode 100644 index 0000000..958dd1b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Pebble.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Rough.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Rough.uasset new file mode 100644 index 0000000..fb1c6d3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Rough.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Smooth.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Smooth.uasset new file mode 100644 index 0000000..642aaaa Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_CobbleStone_Smooth.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_ColorGrid_LowSpec.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_ColorGrid_LowSpec.uasset new file mode 100644 index 0000000..4b25f74 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_ColorGrid_LowSpec.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Grime.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Grime.uasset new file mode 100644 index 0000000..3be6070 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Grime.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Panels.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Panels.uasset new file mode 100644 index 0000000..d843626 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Panels.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Poured.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Poured.uasset new file mode 100644 index 0000000..34661da Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Poured.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Tiles.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Tiles.uasset new file mode 100644 index 0000000..26e7163 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Concrete_Tiles.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Glass.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Glass.uasset new file mode 100644 index 0000000..7168e4f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Glass.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Grass.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Grass.uasset new file mode 100644 index 0000000..1cbe2a5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Grass.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Gravel.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Gravel.uasset new file mode 100644 index 0000000..7d3d68f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Gravel.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Moss.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Moss.uasset new file mode 100644 index 0000000..ff1f454 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Ground_Moss.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Brushed_Nickel.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Brushed_Nickel.uasset new file mode 100644 index 0000000..e34b606 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Brushed_Nickel.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Burnished_Steel.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Burnished_Steel.uasset new file mode 100644 index 0000000..5091518 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Burnished_Steel.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Chrome.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Chrome.uasset new file mode 100644 index 0000000..2997cde Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Chrome.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Copper.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Copper.uasset new file mode 100644 index 0000000..2f3841c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Copper.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Gold.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Gold.uasset new file mode 100644 index 0000000..0fc3df3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Gold.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Rust.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Rust.uasset new file mode 100644 index 0000000..8402144 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Rust.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Steel.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Steel.uasset new file mode 100644 index 0000000..e303340 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Metal_Steel.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Basalt.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Basalt.uasset new file mode 100644 index 0000000..d2cf1ba Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Basalt.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Marble_Polished.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Marble_Polished.uasset new file mode 100644 index 0000000..d177e32 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Marble_Polished.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Sandstone.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Sandstone.uasset new file mode 100644 index 0000000..4ca7e31 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Sandstone.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Slate.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Slate.uasset new file mode 100644 index 0000000..53f6bb8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Rock_Slate.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Checker_Dot.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Checker_Dot.uasset new file mode 100644 index 0000000..041b0f8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Checker_Dot.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Hex_Tile.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Hex_Tile.uasset new file mode 100644 index 0000000..f102368 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Hex_Tile.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Hex_Tile_Pulse.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Hex_Tile_Pulse.uasset new file mode 100644 index 0000000..570262a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Hex_Tile_Pulse.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Panel.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Panel.uasset new file mode 100644 index 0000000..1afccae Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Tech_Panel.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Water_Lake.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Water_Lake.uasset new file mode 100644 index 0000000..88a6333 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Water_Lake.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Water_Ocean.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Water_Ocean.uasset new file mode 100644 index 0000000..1ff0460 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Water_Ocean.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Floor_Walnut_Polished.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Floor_Walnut_Polished.uasset new file mode 100644 index 0000000..8bbba08 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Floor_Walnut_Polished.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Floor_Walnut_Worn.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Floor_Walnut_Worn.uasset new file mode 100644 index 0000000..229a294 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Floor_Walnut_Worn.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Oak.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Oak.uasset new file mode 100644 index 0000000..d722444 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Oak.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Pine.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Pine.uasset new file mode 100644 index 0000000..b02101c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Pine.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Walnut.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Walnut.uasset new file mode 100644 index 0000000..6e76341 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Materials/M_Wood_Walnut.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Burst.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Burst.uasset new file mode 100644 index 0000000..12caa0a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Burst.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Dust_Particle.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Dust_Particle.uasset new file mode 100644 index 0000000..4f665d0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Dust_Particle.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Fire_SubUV.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Fire_SubUV.uasset new file mode 100644 index 0000000..73f3eaa Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Fire_SubUV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Heat_Distortion.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Heat_Distortion.uasset new file mode 100644 index 0000000..d34ee58 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Heat_Distortion.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Radial_Gradient.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Radial_Gradient.uasset new file mode 100644 index 0000000..173be8c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Radial_Gradient.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Spark.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Spark.uasset new file mode 100644 index 0000000..6f6f699 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_Spark.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_explosion_subUV.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_explosion_subUV.uasset new file mode 100644 index 0000000..1af76e6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_explosion_subUV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_radial_ramp.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_radial_ramp.uasset new file mode 100644 index 0000000..f35047d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_radial_ramp.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_smoke_subUV.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_smoke_subUV.uasset new file mode 100644 index 0000000..2086e5f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/M_smoke_subUV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/m_flare_01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/m_flare_01.uasset new file mode 100644 index 0000000..824b44b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/Materials/m_flare_01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Ambient_Dust.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Ambient_Dust.uasset new file mode 100644 index 0000000..38b6cab Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Ambient_Dust.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Explosion.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Explosion.uasset new file mode 100644 index 0000000..8f6e03a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Explosion.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Fire.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Fire.uasset new file mode 100644 index 0000000..3fb74a8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Fire.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Smoke.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Smoke.uasset new file mode 100644 index 0000000..a6014df Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Smoke.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Sparks.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Sparks.uasset new file mode 100644 index 0000000..8a6dc37 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Sparks.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Steam_Lit.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Steam_Lit.uasset new file mode 100644 index 0000000..3e96da7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Particles/P_Steam_Lit.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/MaterialSphere.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/MaterialSphere.uasset new file mode 100644 index 0000000..6a2538f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/MaterialSphere.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Bush.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Bush.uasset new file mode 100644 index 0000000..eaa4a2a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Bush.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Chair.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Chair.uasset new file mode 100644 index 0000000..76ef00f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Chair.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Door.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Door.uasset new file mode 100644 index 0000000..714d0f6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Door.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Frame.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Frame.uasset new file mode 100644 index 0000000..2a2dff8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Frame.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Lamp.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Lamp.uasset new file mode 100644 index 0000000..3eb6663 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Lamp.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Rock.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Rock.uasset new file mode 100644 index 0000000..2d59537 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Rock.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Shelf.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Shelf.uasset new file mode 100644 index 0000000..2444258 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Shelf.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Statue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Statue.uasset new file mode 100644 index 0000000..775313d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_Statue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_StatueGlass.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_StatueGlass.uasset new file mode 100644 index 0000000..d1592b3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_StatueGlass.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_TableRound.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_TableRound.uasset new file mode 100644 index 0000000..b008428 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/Materials/M_TableRound.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Bush.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Bush.uasset new file mode 100644 index 0000000..060a376 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Bush.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Chair.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Chair.uasset new file mode 100644 index 0000000..e062426 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Chair.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_CornerFrame.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_CornerFrame.uasset new file mode 100644 index 0000000..5710151 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_CornerFrame.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Couch.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Couch.uasset new file mode 100644 index 0000000..cc7d408 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Couch.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Door.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Door.uasset new file mode 100644 index 0000000..22c9bfc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Door.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_DoorFrame.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_DoorFrame.uasset new file mode 100644 index 0000000..ab5e96f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_DoorFrame.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_GlassWindow.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_GlassWindow.uasset new file mode 100644 index 0000000..93863f4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_GlassWindow.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Lamp_Ceiling.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Lamp_Ceiling.uasset new file mode 100644 index 0000000..4e55f04 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Lamp_Ceiling.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Lamp_Wall.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Lamp_Wall.uasset new file mode 100644 index 0000000..a1b112f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Lamp_Wall.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_PillarFrame.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_PillarFrame.uasset new file mode 100644 index 0000000..7cafefe Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_PillarFrame.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_PillarFrame300.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_PillarFrame300.uasset new file mode 100644 index 0000000..c681a0a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_PillarFrame300.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Rock.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Rock.uasset new file mode 100644 index 0000000..419f4d5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Rock.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Shelf.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Shelf.uasset new file mode 100644 index 0000000..7ebb820 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Shelf.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Stairs.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Stairs.uasset new file mode 100644 index 0000000..d0e84cc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Stairs.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Statue.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Statue.uasset new file mode 100644 index 0000000..d0e5b8d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_Statue.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_TableRound.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_TableRound.uasset new file mode 100644 index 0000000..317b8ff Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_TableRound.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_WindowFrame.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_WindowFrame.uasset new file mode 100644 index 0000000..bfc9f90 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Props/SM_WindowFrame.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cone.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cone.uasset new file mode 100644 index 0000000..200f0a2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cone.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cube.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cube.uasset new file mode 100644 index 0000000..4d169fe Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cube.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cylinder.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cylinder.uasset new file mode 100644 index 0000000..06541d9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Cylinder.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_NarrowCapsule.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_NarrowCapsule.uasset new file mode 100644 index 0000000..0322b31 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_NarrowCapsule.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe.uasset new file mode 100644 index 0000000..f2549a3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe_180.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe_180.uasset new file mode 100644 index 0000000..b152330 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe_180.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe_90.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe_90.uasset new file mode 100644 index 0000000..db79ad4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Pipe_90.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Plane.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Plane.uasset new file mode 100644 index 0000000..f338efa Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Plane.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_QuadPyramid.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_QuadPyramid.uasset new file mode 100644 index 0000000..e228f15 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_QuadPyramid.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Sphere.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Sphere.uasset new file mode 100644 index 0000000..0b7fc69 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Sphere.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Torus.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Torus.uasset new file mode 100644 index 0000000..cfbaac4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Torus.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_TriPyramid.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_TriPyramid.uasset new file mode 100644 index 0000000..f28d857 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_TriPyramid.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim.uasset new file mode 100644 index 0000000..0909161 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim_90_In.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim_90_In.uasset new file mode 100644 index 0000000..6e33a90 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim_90_In.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim_90_Out.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim_90_Out.uasset new file mode 100644 index 0000000..8125f77 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Trim_90_Out.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Tube.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Tube.uasset new file mode 100644 index 0000000..b2e9a43 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Tube.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Wedge_A.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Wedge_A.uasset new file mode 100644 index 0000000..b99fde7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Wedge_A.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Wedge_B.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Wedge_B.uasset new file mode 100644 index 0000000..2e8f430 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_Wedge_B.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_WideCapsule.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_WideCapsule.uasset new file mode 100644 index 0000000..830b90d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Shapes/Shape_WideCapsule.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_D.uasset new file mode 100644 index 0000000..8ea9227 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_M.uasset new file mode 100644 index 0000000..995cc82 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_N.uasset new file mode 100644 index 0000000..bf6633d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Beveled_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_D.uasset new file mode 100644 index 0000000..5d32850 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_M.uasset new file mode 100644 index 0000000..e386e9d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_N.uasset new file mode 100644 index 0000000..f4dc14a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_New_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Old_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Old_D.uasset new file mode 100644 index 0000000..acec520 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Old_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Old_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Old_N.uasset new file mode 100644 index 0000000..49fac3f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Clay_Old_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Cut_Stone_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Cut_Stone_D.uasset new file mode 100644 index 0000000..1f76e63 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Cut_Stone_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Cut_Stone_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Cut_Stone_N.uasset new file mode 100644 index 0000000..9cf63ce Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Cut_Stone_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_D.uasset new file mode 100644 index 0000000..cf67614 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_M.uasset new file mode 100644 index 0000000..81c5fcf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_N.uasset new file mode 100644 index 0000000..27c49b5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Brick_Hewn_Stone_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Burst_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Burst_M.uasset new file mode 100644 index 0000000..35b26fc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Burst_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Bush_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Bush_D.uasset new file mode 100644 index 0000000..d539936 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Bush_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Bush_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Bush_N.uasset new file mode 100644 index 0000000..a9f1c7e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Bush_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ceramic_Tile_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ceramic_Tile_M.uasset new file mode 100644 index 0000000..8214218 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ceramic_Tile_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ceramic_Tile_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ceramic_Tile_N.uasset new file mode 100644 index 0000000..343aeb8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ceramic_Tile_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Chair_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Chair_M.uasset new file mode 100644 index 0000000..40e1e6f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Chair_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Chair_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Chair_N.uasset new file mode 100644 index 0000000..af1c8a4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Chair_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Checker_Noise_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Checker_Noise_M.uasset new file mode 100644 index 0000000..58b5668 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Checker_Noise_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_D.uasset new file mode 100644 index 0000000..bc3db66 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_M.uasset new file mode 100644 index 0000000..7a953e9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_N.uasset new file mode 100644 index 0000000..46da547 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Pebble_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Rough_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Rough_D.uasset new file mode 100644 index 0000000..1bc4666 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Rough_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Rough_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Rough_N.uasset new file mode 100644 index 0000000..935d1af Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Rough_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_D.uasset new file mode 100644 index 0000000..44e5597 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_M.uasset new file mode 100644 index 0000000..165106f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_N.uasset new file mode 100644 index 0000000..4207398 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_CobbleStone_Smooth_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Grime_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Grime_D.uasset new file mode 100644 index 0000000..d6667d2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Grime_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Panels_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Panels_D.uasset new file mode 100644 index 0000000..75134e3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Panels_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Panels_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Panels_N.uasset new file mode 100644 index 0000000..6db0432 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Panels_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Poured_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Poured_D.uasset new file mode 100644 index 0000000..f2d651c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Poured_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Poured_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Poured_N.uasset new file mode 100644 index 0000000..edc2e1b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Poured_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_D.uasset new file mode 100644 index 0000000..b98f3a7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_M.uasset new file mode 100644 index 0000000..cc1fe76 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_N.uasset new file mode 100644 index 0000000..d5d6b3a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_Variation_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_Variation_M.uasset new file mode 100644 index 0000000..5edef8f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Concrete_Tiles_Variation_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Detail_Rocky_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Detail_Rocky_N.uasset new file mode 100644 index 0000000..a80dc77 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Detail_Rocky_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Door_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Door_M.uasset new file mode 100644 index 0000000..b5eec21 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Door_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Door_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Door_N.uasset new file mode 100644 index 0000000..93e2c30 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Door_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Dust_Particle_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Dust_Particle_D.uasset new file mode 100644 index 0000000..d80b3a0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Dust_Particle_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Explosion_SubUV.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Explosion_SubUV.uasset new file mode 100644 index 0000000..d30f842 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Explosion_SubUV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Fire_SubUV.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Fire_SubUV.uasset new file mode 100644 index 0000000..6e87ac7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Fire_SubUV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Fire_Tiled_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Fire_Tiled_D.uasset new file mode 100644 index 0000000..825765f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Fire_Tiled_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Frame_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Frame_M.uasset new file mode 100644 index 0000000..4aeac1c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Frame_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Frame_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Frame_N.uasset new file mode 100644 index 0000000..b1a335d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Frame_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Gradinet_01.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Gradinet_01.uasset new file mode 100644 index 0000000..a71d3dd Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Gradinet_01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Grass_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Grass_D.uasset new file mode 100644 index 0000000..0ce49d3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Grass_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Grass_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Grass_N.uasset new file mode 100644 index 0000000..c69da0d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Grass_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Gravel_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Gravel_D.uasset new file mode 100644 index 0000000..3064541 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Gravel_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Gravel_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Gravel_N.uasset new file mode 100644 index 0000000..e9f55a7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Gravel_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Moss_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Moss_N.uasset new file mode 100644 index 0000000..898e6ee Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Ground_Moss_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Lamp_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Lamp_M.uasset new file mode 100644 index 0000000..e1958b0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Lamp_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Lamp_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Lamp_N.uasset new file mode 100644 index 0000000..77e47bd Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Lamp_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_MacroVariation.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_MacroVariation.uasset new file mode 100644 index 0000000..dca6463 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_MacroVariation.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Aluminum_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Aluminum_D.uasset new file mode 100644 index 0000000..225628a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Aluminum_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Copper_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Copper_D.uasset new file mode 100644 index 0000000..df0cacb Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Copper_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Gold_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Gold_D.uasset new file mode 100644 index 0000000..0762c01 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Gold_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Gold_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Gold_N.uasset new file mode 100644 index 0000000..938e7c3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Gold_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Rust_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Rust_D.uasset new file mode 100644 index 0000000..2a47b53 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Rust_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Rust_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Rust_N.uasset new file mode 100644 index 0000000..c94e24d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Rust_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Steel_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Steel_D.uasset new file mode 100644 index 0000000..bc8ee97 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Steel_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Steel_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Steel_N.uasset new file mode 100644 index 0000000..bd90253 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Metal_Steel_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Perlin_Noise_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Perlin_Noise_M.uasset new file mode 100644 index 0000000..a71f39d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Perlin_Noise_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_RockMesh_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_RockMesh_M.uasset new file mode 100644 index 0000000..91a8dbe Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_RockMesh_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_RockMesh_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_RockMesh_N.uasset new file mode 100644 index 0000000..cf18346 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_RockMesh_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Basalt_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Basalt_D.uasset new file mode 100644 index 0000000..15197b2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Basalt_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Basalt_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Basalt_N.uasset new file mode 100644 index 0000000..17ac16e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Basalt_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Marble_Polished_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Marble_Polished_D.uasset new file mode 100644 index 0000000..cc564e5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Marble_Polished_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Sandstone_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Sandstone_D.uasset new file mode 100644 index 0000000..efc7c83 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Sandstone_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Sandstone_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Sandstone_N.uasset new file mode 100644 index 0000000..942331b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Sandstone_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Slate_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Slate_D.uasset new file mode 100644 index 0000000..b460e81 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Slate_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Slate_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Slate_N.uasset new file mode 100644 index 0000000..3eb6b14 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Slate_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Smooth_Granite_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Smooth_Granite_D.uasset new file mode 100644 index 0000000..9c11db2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Rock_Smooth_Granite_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Shelf_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Shelf_M.uasset new file mode 100644 index 0000000..40bea03 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Shelf_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Shelf_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Shelf_N.uasset new file mode 100644 index 0000000..5cb6c71 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Shelf_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Single_Tile_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Single_Tile_N.uasset new file mode 100644 index 0000000..ddc0828 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Single_Tile_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Smoke_SubUV.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Smoke_SubUV.uasset new file mode 100644 index 0000000..5c8a2d9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Smoke_SubUV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Smoke_Tiled_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Smoke_Tiled_D.uasset new file mode 100644 index 0000000..aad7a5e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Smoke_Tiled_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Spark_Core.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Spark_Core.uasset new file mode 100644 index 0000000..3881b88 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Spark_Core.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Statue_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Statue_M.uasset new file mode 100644 index 0000000..d43158a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Statue_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Statue_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Statue_N.uasset new file mode 100644 index 0000000..787d2d5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Statue_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_TableRound_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_TableRound_M.uasset new file mode 100644 index 0000000..a76573e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_TableRound_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_TableRound_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_TableRound_N.uasset new file mode 100644 index 0000000..619c420 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_TableRound_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Dot_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Dot_M.uasset new file mode 100644 index 0000000..fb692b3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Dot_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Dot_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Dot_N.uasset new file mode 100644 index 0000000..50d81c2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Dot_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Hex_Tile_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Hex_Tile_M.uasset new file mode 100644 index 0000000..502170b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Hex_Tile_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Hex_Tile_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Hex_Tile_N.uasset new file mode 100644 index 0000000..549633c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Hex_Tile_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Panel_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Panel_M.uasset new file mode 100644 index 0000000..192a8e4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Panel_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Panel_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Panel_N.uasset new file mode 100644 index 0000000..b12087e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Tech_Panel_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Water_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Water_M.uasset new file mode 100644 index 0000000..63e9b4e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Water_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Water_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Water_N.uasset new file mode 100644 index 0000000..dc83c1b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Water_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_D.uasset new file mode 100644 index 0000000..0598d9e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_M.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_M.uasset new file mode 100644 index 0000000..1af473f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_N.uasset new file mode 100644 index 0000000..dae4bb4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Floor_Walnut_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Oak_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Oak_D.uasset new file mode 100644 index 0000000..c5494a9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Oak_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Oak_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Oak_N.uasset new file mode 100644 index 0000000..71543aa Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Oak_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Pine_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Pine_D.uasset new file mode 100644 index 0000000..eac50af Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Pine_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Pine_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Pine_N.uasset new file mode 100644 index 0000000..051a794 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Pine_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Walnut_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Walnut_D.uasset new file mode 100644 index 0000000..bc3c3df Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Walnut_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Walnut_N.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Walnut_N.uasset new file mode 100644 index 0000000..856a1f8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_Wood_Walnut_N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_ground_Moss_D.uasset b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_ground_Moss_D.uasset new file mode 100644 index 0000000..2b9ca5b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/StarterContent/Textures/T_ground_Moss_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/T_Fire_Tiled_D.uasset b/UE5/Cpp/G3NTs/Content/T_Fire_Tiled_D.uasset new file mode 100644 index 0000000..ceb4ba1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/T_Fire_Tiled_D.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/0M/LYKU8MRWM4BO3O1FDZBG2U.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/0M/LYKU8MRWM4BO3O1FDZBG2U.uasset new file mode 100644 index 0000000..e2b19f3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/0M/LYKU8MRWM4BO3O1FDZBG2U.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/1N/XRMISV2E7GJB8KOJ45SWBH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/1N/XRMISV2E7GJB8KOJ45SWBH.uasset new file mode 100644 index 0000000..976ddf4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/1N/XRMISV2E7GJB8KOJ45SWBH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/7P/QZX5AESKLO855EVPT5JU20.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/7P/QZX5AESKLO855EVPT5JU20.uasset new file mode 100644 index 0000000..61057f3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/7P/QZX5AESKLO855EVPT5JU20.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/8M/U3W7H6ZMV2W7JI9L4Q1W25.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/8M/U3W7H6ZMV2W7JI9L4Q1W25.uasset new file mode 100644 index 0000000..7fb76df Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/8M/U3W7H6ZMV2W7JI9L4Q1W25.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/B5/M700MGNJHRC2KPG7GK2Q4L.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/B5/M700MGNJHRC2KPG7GK2Q4L.uasset new file mode 100644 index 0000000..f0c3df0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/B5/M700MGNJHRC2KPG7GK2Q4L.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/CL/381LM03PFI8AF9NED1SEV2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/CL/381LM03PFI8AF9NED1SEV2.uasset new file mode 100644 index 0000000..6215a03 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/CL/381LM03PFI8AF9NED1SEV2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/CQ/LI4JW3B0ER7NS56GREKYAT.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/CQ/LI4JW3B0ER7NS56GREKYAT.uasset new file mode 100644 index 0000000..1b3aba4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/CQ/LI4JW3B0ER7NS56GREKYAT.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/FT/N0Q4H36IA14XIY98SNCTFP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/FT/N0Q4H36IA14XIY98SNCTFP.uasset new file mode 100644 index 0000000..134ba82 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/FT/N0Q4H36IA14XIY98SNCTFP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/GO/I8WEFD3RY9V3NVQLSU6QM4.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/GO/I8WEFD3RY9V3NVQLSU6QM4.uasset new file mode 100644 index 0000000..f192f74 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/GO/I8WEFD3RY9V3NVQLSU6QM4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/N6/K9422I8YBRU53JXDIGNG0B.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/N6/K9422I8YBRU53JXDIGNG0B.uasset new file mode 100644 index 0000000..94e8d4b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/N6/K9422I8YBRU53JXDIGNG0B.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/NB/NWWEVRQSGT6ARVZ8HQLCM9.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/NB/NWWEVRQSGT6ARVZ8HQLCM9.uasset new file mode 100644 index 0000000..2f31112 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/NB/NWWEVRQSGT6ARVZ8HQLCM9.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/NK/2RHTP3D4ZNGOY9N87YTVSL.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/NK/2RHTP3D4ZNGOY9N87YTVSL.uasset new file mode 100644 index 0000000..9384431 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/NK/2RHTP3D4ZNGOY9N87YTVSL.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/PP/F23R0XGGICI620KS0I06V1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/PP/F23R0XGGICI620KS0I06V1.uasset new file mode 100644 index 0000000..4edbf23 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/PP/F23R0XGGICI620KS0I06V1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/S4/I01SX7KTS3XEOY9TJQU1D0.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/S4/I01SX7KTS3XEOY9TJQU1D0.uasset new file mode 100644 index 0000000..ca6e87b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/S4/I01SX7KTS3XEOY9TJQU1D0.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/SX/42E01A89190V1B90GMIIFK.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/SX/42E01A89190V1B90GMIIFK.uasset new file mode 100644 index 0000000..84367a9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/SX/42E01A89190V1B90GMIIFK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/XV/VTAF5COFGLO9YT51MQCVTR.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/XV/VTAF5COFGLO9YT51MQCVTR.uasset new file mode 100644 index 0000000..2f11708 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/0/XV/VTAF5COFGLO9YT51MQCVTR.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/2J/R4MRTH8FEAO7ML1BCJFIZ2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/2J/R4MRTH8FEAO7ML1BCJFIZ2.uasset new file mode 100644 index 0000000..c423256 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/2J/R4MRTH8FEAO7ML1BCJFIZ2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/37/3EARJC7CXLDF6N12ACBGD8.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/37/3EARJC7CXLDF6N12ACBGD8.uasset new file mode 100644 index 0000000..fcfa952 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/37/3EARJC7CXLDF6N12ACBGD8.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/5O/5N1HJRGUOMF97732AGXOIH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/5O/5N1HJRGUOMF97732AGXOIH.uasset new file mode 100644 index 0000000..c7aac7b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/5O/5N1HJRGUOMF97732AGXOIH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/9X/SWX8GTX28C4X0ERNTBO9CB.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/9X/SWX8GTX28C4X0ERNTBO9CB.uasset new file mode 100644 index 0000000..6371296 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/9X/SWX8GTX28C4X0ERNTBO9CB.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/IW/MIBU8WIGZBO8H45EKM1H16.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/IW/MIBU8WIGZBO8H45EKM1H16.uasset new file mode 100644 index 0000000..2961500 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/IW/MIBU8WIGZBO8H45EKM1H16.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/JT/XIHYQ8ZTVL6F9GCUZX1AQ2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/JT/XIHYQ8ZTVL6F9GCUZX1AQ2.uasset new file mode 100644 index 0000000..cb8811a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/JT/XIHYQ8ZTVL6F9GCUZX1AQ2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/JW/1G01H6U5XE323RE6CYHYUD.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/JW/1G01H6U5XE323RE6CYHYUD.uasset new file mode 100644 index 0000000..37b74f5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/JW/1G01H6U5XE323RE6CYHYUD.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/K8/VBWSTS338RPHUH9RD83V1N.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/K8/VBWSTS338RPHUH9RD83V1N.uasset new file mode 100644 index 0000000..8bdf22d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/K8/VBWSTS338RPHUH9RD83V1N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/ML/E0Z50HW1GU93OOF1KHOLPT.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/ML/E0Z50HW1GU93OOF1KHOLPT.uasset new file mode 100644 index 0000000..7a30378 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/ML/E0Z50HW1GU93OOF1KHOLPT.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/OD/YPSPM063O6XAJVKSDHY2JX.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/OD/YPSPM063O6XAJVKSDHY2JX.uasset new file mode 100644 index 0000000..ce547c9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/OD/YPSPM063O6XAJVKSDHY2JX.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/QX/YLB24O53YWW3Z6UN99MXSK.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/QX/YLB24O53YWW3Z6UN99MXSK.uasset new file mode 100644 index 0000000..ebc99ce Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/QX/YLB24O53YWW3Z6UN99MXSK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/VQ/KNW9KAQCU2C3YKAV0ULU75.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/VQ/KNW9KAQCU2C3YKAV0ULU75.uasset new file mode 100644 index 0000000..3021505 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/1/VQ/KNW9KAQCU2C3YKAV0ULU75.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/3Y/TWBDGY8R02RY62PTY38PRG.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/3Y/TWBDGY8R02RY62PTY38PRG.uasset new file mode 100644 index 0000000..32ae804 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/3Y/TWBDGY8R02RY62PTY38PRG.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/7W/FM5JOC82MMYTV33837A8J8.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/7W/FM5JOC82MMYTV33837A8J8.uasset new file mode 100644 index 0000000..404cb26 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/7W/FM5JOC82MMYTV33837A8J8.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/97/QPQ5W7420SSESRNM9J922P.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/97/QPQ5W7420SSESRNM9J922P.uasset new file mode 100644 index 0000000..742ccac Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/97/QPQ5W7420SSESRNM9J922P.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/9C/YK5PWU4F880P9E6HUAT1NI.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/9C/YK5PWU4F880P9E6HUAT1NI.uasset new file mode 100644 index 0000000..bfa2a0f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/9C/YK5PWU4F880P9E6HUAT1NI.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/EH/OZQDZ4A0ER60TWRV152QMO.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/EH/OZQDZ4A0ER60TWRV152QMO.uasset new file mode 100644 index 0000000..3a4fb32 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/EH/OZQDZ4A0ER60TWRV152QMO.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/Q4/3BPQGK3W37S0JTLKU14NTU.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/Q4/3BPQGK3W37S0JTLKU14NTU.uasset new file mode 100644 index 0000000..0545538 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/Q4/3BPQGK3W37S0JTLKU14NTU.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/RK/TXTWIHVRLLI3ES8INZSV2H.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/RK/TXTWIHVRLLI3ES8INZSV2H.uasset new file mode 100644 index 0000000..799bbb4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/RK/TXTWIHVRLLI3ES8INZSV2H.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/XG/6923ZPU8E2MHWNAMA10OMM.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/XG/6923ZPU8E2MHWNAMA10OMM.uasset new file mode 100644 index 0000000..fafb79d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/2/XG/6923ZPU8E2MHWNAMA10OMM.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/0O/4IRR0TBO7VGKMMYSZRQTB1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/0O/4IRR0TBO7VGKMMYSZRQTB1.uasset new file mode 100644 index 0000000..6dca2f6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/0O/4IRR0TBO7VGKMMYSZRQTB1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/5Q/G6Q73YB1P2AUBI1UFYVBXY.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/5Q/G6Q73YB1P2AUBI1UFYVBXY.uasset new file mode 100644 index 0000000..61b703a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/5Q/G6Q73YB1P2AUBI1UFYVBXY.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/A7/5J234GU99ZR65ZL42W8YLA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/A7/5J234GU99ZR65ZL42W8YLA.uasset new file mode 100644 index 0000000..47117a3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/A7/5J234GU99ZR65ZL42W8YLA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/AI/0XWE3RNM2XQC0ST1KXG02O.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/AI/0XWE3RNM2XQC0ST1KXG02O.uasset new file mode 100644 index 0000000..9c797e9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/AI/0XWE3RNM2XQC0ST1KXG02O.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/C8/Z38FT77DKZLKDXTQ7PZNM4.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/C8/Z38FT77DKZLKDXTQ7PZNM4.uasset new file mode 100644 index 0000000..c69ee84 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/C8/Z38FT77DKZLKDXTQ7PZNM4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/CP/XRLOR3HVYVHJA3N9PKGXZH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/CP/XRLOR3HVYVHJA3N9PKGXZH.uasset new file mode 100644 index 0000000..30c472f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/CP/XRLOR3HVYVHJA3N9PKGXZH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/PQ/3RKZRJA4YH0B5JZCVDMIHX.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/PQ/3RKZRJA4YH0B5JZCVDMIHX.uasset new file mode 100644 index 0000000..9c15dba Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/PQ/3RKZRJA4YH0B5JZCVDMIHX.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/YA/R3DFK7S4MKXALBK08FLRF8.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/YA/R3DFK7S4MKXALBK08FLRF8.uasset new file mode 100644 index 0000000..892b67c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/YA/R3DFK7S4MKXALBK08FLRF8.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/YP/S0JE00A7SZYMUTJ54F2AZA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/YP/S0JE00A7SZYMUTJ54F2AZA.uasset new file mode 100644 index 0000000..37e6a8e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/3/YP/S0JE00A7SZYMUTJ54F2AZA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/AM/L6TG9HS2EF198PITQYGZNB.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/AM/L6TG9HS2EF198PITQYGZNB.uasset new file mode 100644 index 0000000..35581dc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/AM/L6TG9HS2EF198PITQYGZNB.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/CR/SRVPLA8UNZ8XIIP0E036DI.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/CR/SRVPLA8UNZ8XIIP0E036DI.uasset new file mode 100644 index 0000000..be81427 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/CR/SRVPLA8UNZ8XIIP0E036DI.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/E5/6XON0XLIRNWJCBCE62P2VV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/E5/6XON0XLIRNWJCBCE62P2VV.uasset new file mode 100644 index 0000000..a8e9bb7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/E5/6XON0XLIRNWJCBCE62P2VV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/G2/DXY1ROMU8NVTUPH999VNGV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/G2/DXY1ROMU8NVTUPH999VNGV.uasset new file mode 100644 index 0000000..d1f6a66 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/G2/DXY1ROMU8NVTUPH999VNGV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/KO/ZXZG4KJ4WRJYY4FMMBKTY5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/KO/ZXZG4KJ4WRJYY4FMMBKTY5.uasset new file mode 100644 index 0000000..b71b5a7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/KO/ZXZG4KJ4WRJYY4FMMBKTY5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/PT/ZXUQMNLL9GZ2UNQ5D0R4A4.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/PT/ZXUQMNLL9GZ2UNQ5D0R4A4.uasset new file mode 100644 index 0000000..f95ac7c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/PT/ZXUQMNLL9GZ2UNQ5D0R4A4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/R1/E2XU9JZJ2OYP9DKGBD4GBR.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/R1/E2XU9JZJ2OYP9DKGBD4GBR.uasset new file mode 100644 index 0000000..108a181 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/R1/E2XU9JZJ2OYP9DKGBD4GBR.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/RV/S7DSCAUML2K3OCTL8MYKSW.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/RV/S7DSCAUML2K3OCTL8MYKSW.uasset new file mode 100644 index 0000000..3b02769 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/RV/S7DSCAUML2K3OCTL8MYKSW.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/TN/WYSKX8TQ8778V6COSS7GIQ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/TN/WYSKX8TQ8778V6COSS7GIQ.uasset new file mode 100644 index 0000000..65b088f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/TN/WYSKX8TQ8778V6COSS7GIQ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/Z1/KAQ8J7NXJGKW1V6Q06IEDZ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/Z1/KAQ8J7NXJGKW1V6Q06IEDZ.uasset new file mode 100644 index 0000000..83ff507 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/Z1/KAQ8J7NXJGKW1V6Q06IEDZ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/Z9/JTOFIVAX75BWB08P7VJ7L5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/Z9/JTOFIVAX75BWB08P7VJ7L5.uasset new file mode 100644 index 0000000..8dd7c17 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/Z9/JTOFIVAX75BWB08P7VJ7L5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/ZU/MFPWF0K282K1XN3O5BU6BP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/ZU/MFPWF0K282K1XN3O5BU6BP.uasset new file mode 100644 index 0000000..7acf598 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/4/ZU/MFPWF0K282K1XN3O5BU6BP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/7S/0A78UKLU858N28SAZZEZLK.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/7S/0A78UKLU858N28SAZZEZLK.uasset new file mode 100644 index 0000000..5db9f30 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/7S/0A78UKLU858N28SAZZEZLK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/8I/AUW21F8GR59MYIGTTEB953.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/8I/AUW21F8GR59MYIGTTEB953.uasset new file mode 100644 index 0000000..b5a18f4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/8I/AUW21F8GR59MYIGTTEB953.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/8R/S6EY89XW6O2G1G017TSTVY.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/8R/S6EY89XW6O2G1G017TSTVY.uasset new file mode 100644 index 0000000..10f0a60 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/8R/S6EY89XW6O2G1G017TSTVY.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BE/4T1OPBV3C63QN1YGUTNJ2Z.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BE/4T1OPBV3C63QN1YGUTNJ2Z.uasset new file mode 100644 index 0000000..e26ca5d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BE/4T1OPBV3C63QN1YGUTNJ2Z.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BG/D05B3M91N0W7LDMA16YXFO.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BG/D05B3M91N0W7LDMA16YXFO.uasset new file mode 100644 index 0000000..e2a4646 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BG/D05B3M91N0W7LDMA16YXFO.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BN/ACMV544ADPPB3F4YFV70P2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BN/ACMV544ADPPB3F4YFV70P2.uasset new file mode 100644 index 0000000..15bd455 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/BN/ACMV544ADPPB3F4YFV70P2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/DI/1JZHHCOBVQ2F5XRUWSES1X.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/DI/1JZHHCOBVQ2F5XRUWSES1X.uasset new file mode 100644 index 0000000..3dc8672 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/DI/1JZHHCOBVQ2F5XRUWSES1X.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/J8/4EFWR1Z87CIWQ9GK5IZ2EH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/J8/4EFWR1Z87CIWQ9GK5IZ2EH.uasset new file mode 100644 index 0000000..71fbe09 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/J8/4EFWR1Z87CIWQ9GK5IZ2EH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/NU/2EUF7XP4CCGPOYOA4ZGGZH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/NU/2EUF7XP4CCGPOYOA4ZGGZH.uasset new file mode 100644 index 0000000..f367748 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/NU/2EUF7XP4CCGPOYOA4ZGGZH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/PI/IKHLFQB09T3O2GIJROGWKH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/PI/IKHLFQB09T3O2GIJROGWKH.uasset new file mode 100644 index 0000000..5b729e7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/PI/IKHLFQB09T3O2GIJROGWKH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/SB/9VS196XXGLXC0XQEJWLUTQ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/SB/9VS196XXGLXC0XQEJWLUTQ.uasset new file mode 100644 index 0000000..cf41b57 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/SB/9VS196XXGLXC0XQEJWLUTQ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/W4/MXSOOLN47B2MJB5ZNQINHQ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/W4/MXSOOLN47B2MJB5ZNQINHQ.uasset new file mode 100644 index 0000000..8e53d9c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/5/W4/MXSOOLN47B2MJB5ZNQINHQ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/0Z/5RQIHCZ9W3UXRGL4LTLQAK.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/0Z/5RQIHCZ9W3UXRGL4LTLQAK.uasset new file mode 100644 index 0000000..3203a3f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/0Z/5RQIHCZ9W3UXRGL4LTLQAK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/4G/3M9NTNT5MTB320MZAW1HLV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/4G/3M9NTNT5MTB320MZAW1HLV.uasset new file mode 100644 index 0000000..0fb677e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/4G/3M9NTNT5MTB320MZAW1HLV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/7T/GM0EQ2Z7BN3RV91M3TA1BD.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/7T/GM0EQ2Z7BN3RV91M3TA1BD.uasset new file mode 100644 index 0000000..74d9660 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/7T/GM0EQ2Z7BN3RV91M3TA1BD.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/83/ZP549MACV0ZQHFMGT9RV14.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/83/ZP549MACV0ZQHFMGT9RV14.uasset new file mode 100644 index 0000000..1f8043e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/83/ZP549MACV0ZQHFMGT9RV14.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/AJ/2XZ3RUK0LFB63FVNQE7P5R.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/AJ/2XZ3RUK0LFB63FVNQE7P5R.uasset new file mode 100644 index 0000000..fd72cc1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/AJ/2XZ3RUK0LFB63FVNQE7P5R.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/CM/JQ3XGG8LVX7CH4P73CY9Y6.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/CM/JQ3XGG8LVX7CH4P73CY9Y6.uasset new file mode 100644 index 0000000..92052f5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/CM/JQ3XGG8LVX7CH4P73CY9Y6.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/ZF/33Z65AXVK7FL9I726PVY21.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/ZF/33Z65AXVK7FL9I726PVY21.uasset new file mode 100644 index 0000000..45ff636 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/6/ZF/33Z65AXVK7FL9I726PVY21.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/0Y/XZQ728K7SB7H564BVHH9VG.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/0Y/XZQ728K7SB7H564BVHH9VG.uasset new file mode 100644 index 0000000..7cb8185 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/0Y/XZQ728K7SB7H564BVHH9VG.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/1B/QGCA3EE3K9NRQGXOX1EEPA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/1B/QGCA3EE3K9NRQGXOX1EEPA.uasset new file mode 100644 index 0000000..9f88edf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/1B/QGCA3EE3K9NRQGXOX1EEPA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/5X/6EW8RE9VA2GGHRWK614FCI.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/5X/6EW8RE9VA2GGHRWK614FCI.uasset new file mode 100644 index 0000000..bcc0080 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/5X/6EW8RE9VA2GGHRWK614FCI.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/7K/GDOSS6SO4DCMH19JNQP839.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/7K/GDOSS6SO4DCMH19JNQP839.uasset new file mode 100644 index 0000000..bf4f3a8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/7K/GDOSS6SO4DCMH19JNQP839.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/7L/BAF6WHJYB864TXU8PWKZ97.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/7L/BAF6WHJYB864TXU8PWKZ97.uasset new file mode 100644 index 0000000..86e7471 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/7L/BAF6WHJYB864TXU8PWKZ97.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/8K/0OLPBOSZCPU1X7E3PCLCGF.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/8K/0OLPBOSZCPU1X7E3PCLCGF.uasset new file mode 100644 index 0000000..4302202 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/8K/0OLPBOSZCPU1X7E3PCLCGF.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/BQ/T6K7YC72X7UQCX0HPXXZ7N.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/BQ/T6K7YC72X7UQCX0HPXXZ7N.uasset new file mode 100644 index 0000000..b649d04 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/BQ/T6K7YC72X7UQCX0HPXXZ7N.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/DF/1GID8P6B00XRWKYCXU7HT1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/DF/1GID8P6B00XRWKYCXU7HT1.uasset new file mode 100644 index 0000000..c548108 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/DF/1GID8P6B00XRWKYCXU7HT1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/GI/GZM47KS5FPIQH5TLSYC1ME.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/GI/GZM47KS5FPIQH5TLSYC1ME.uasset new file mode 100644 index 0000000..73d527c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/GI/GZM47KS5FPIQH5TLSYC1ME.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/HL/3A3POP8RT90RNDORENCLJJ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/HL/3A3POP8RT90RNDORENCLJJ.uasset new file mode 100644 index 0000000..84b89a3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/HL/3A3POP8RT90RNDORENCLJJ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/JN/R9OGWFQQNQ3P85VM1IQC50.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/JN/R9OGWFQQNQ3P85VM1IQC50.uasset new file mode 100644 index 0000000..38f5808 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/JN/R9OGWFQQNQ3P85VM1IQC50.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/L5/1ZJ54FMA0DAL3I2Q8RFAIB.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/L5/1ZJ54FMA0DAL3I2Q8RFAIB.uasset new file mode 100644 index 0000000..697c0c3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/L5/1ZJ54FMA0DAL3I2Q8RFAIB.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/OH/IR5T04XMEBCKQ4G9B5K24A.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/OH/IR5T04XMEBCKQ4G9B5K24A.uasset new file mode 100644 index 0000000..05b7b27 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/OH/IR5T04XMEBCKQ4G9B5K24A.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/P4/VZ8IAGC1BFVRF1V0NF93RO.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/P4/VZ8IAGC1BFVRF1V0NF93RO.uasset new file mode 100644 index 0000000..2858c11 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/P4/VZ8IAGC1BFVRF1V0NF93RO.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/R7/C1Y3ROWTXW8PDSNMPZ2FP5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/R7/C1Y3ROWTXW8PDSNMPZ2FP5.uasset new file mode 100644 index 0000000..c187f49 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/R7/C1Y3ROWTXW8PDSNMPZ2FP5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/W7/FTJCP62P52JH8NYX5T1VG4.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/W7/FTJCP62P52JH8NYX5T1VG4.uasset new file mode 100644 index 0000000..fba8302 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/7/W7/FTJCP62P52JH8NYX5T1VG4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/4L/NB1TL5SIU6B2LD6PYABGX2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/4L/NB1TL5SIU6B2LD6PYABGX2.uasset new file mode 100644 index 0000000..1c654c8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/4L/NB1TL5SIU6B2LD6PYABGX2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/66/W3AKQJP00WNIQ3TB5X3CCV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/66/W3AKQJP00WNIQ3TB5X3CCV.uasset new file mode 100644 index 0000000..eb443e8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/66/W3AKQJP00WNIQ3TB5X3CCV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/7H/8FX9C1R6GJXVLKQ4MOWZ35.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/7H/8FX9C1R6GJXVLKQ4MOWZ35.uasset new file mode 100644 index 0000000..e46def0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/7H/8FX9C1R6GJXVLKQ4MOWZ35.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/80/RCXALNT3NG94XMV0V6D4XE.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/80/RCXALNT3NG94XMV0V6D4XE.uasset new file mode 100644 index 0000000..a685c46 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/80/RCXALNT3NG94XMV0V6D4XE.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/83/6RZW5VC28MFS6Q2QIMMJV5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/83/6RZW5VC28MFS6Q2QIMMJV5.uasset new file mode 100644 index 0000000..ce41094 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/83/6RZW5VC28MFS6Q2QIMMJV5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/AP/BLZGY9HNBUNBCR2P10XS8R.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/AP/BLZGY9HNBUNBCR2P10XS8R.uasset new file mode 100644 index 0000000..9b98852 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/AP/BLZGY9HNBUNBCR2P10XS8R.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/CF/ZNIOCRD90Z70MMV9NMW778.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/CF/ZNIOCRD90Z70MMV9NMW778.uasset new file mode 100644 index 0000000..4c98462 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/CF/ZNIOCRD90Z70MMV9NMW778.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/IL/YBLD3SSU4C9SLRVMYU7TMH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/IL/YBLD3SSU4C9SLRVMYU7TMH.uasset new file mode 100644 index 0000000..ec335b1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/IL/YBLD3SSU4C9SLRVMYU7TMH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/IP/29REQG3FAV3HX794KOUDJV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/IP/29REQG3FAV3HX794KOUDJV.uasset new file mode 100644 index 0000000..323a157 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/IP/29REQG3FAV3HX794KOUDJV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/N6/7HWHBG6K5ONLNTKPMLXMYR.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/N6/7HWHBG6K5ONLNTKPMLXMYR.uasset new file mode 100644 index 0000000..90d5d6c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/N6/7HWHBG6K5ONLNTKPMLXMYR.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Q1/FWZ59Z77TQFHFBGK4YZMUH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Q1/FWZ59Z77TQFHFBGK4YZMUH.uasset new file mode 100644 index 0000000..07177c2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Q1/FWZ59Z77TQFHFBGK4YZMUH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/SZ/D1AHM62WL9TXSNPYQDXQMZ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/SZ/D1AHM62WL9TXSNPYQDXQMZ.uasset new file mode 100644 index 0000000..c1d95e1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/SZ/D1AHM62WL9TXSNPYQDXQMZ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/U5/5AX39XHXVWVQN7SUYOQ2A1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/U5/5AX39XHXVWVQN7SUYOQ2A1.uasset new file mode 100644 index 0000000..2beb3de Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/U5/5AX39XHXVWVQN7SUYOQ2A1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/WQ/ZT39Y7XEQXUF1H04EP40LL.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/WQ/ZT39Y7XEQXUF1H04EP40LL.uasset new file mode 100644 index 0000000..d73a122 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/WQ/ZT39Y7XEQXUF1H04EP40LL.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Y4/KY9ZXT77SAVGWBRTNCFCSC.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Y4/KY9ZXT77SAVGWBRTNCFCSC.uasset new file mode 100644 index 0000000..e389fd2 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Y4/KY9ZXT77SAVGWBRTNCFCSC.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Z7/W1SXRCM1KAKBJOIZDLHZ47.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Z7/W1SXRCM1KAKBJOIZDLHZ47.uasset new file mode 100644 index 0000000..c35c1ed Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/Z7/W1SXRCM1KAKBJOIZDLHZ47.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/ZO/1ERWE3O2LG6KAUSA2W3KH2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/ZO/1ERWE3O2LG6KAUSA2W3KH2.uasset new file mode 100644 index 0000000..80d5320 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/8/ZO/1ERWE3O2LG6KAUSA2W3KH2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/04/9C4ZIZ8X7JBGIGBI4EEZN3.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/04/9C4ZIZ8X7JBGIGBI4EEZN3.uasset new file mode 100644 index 0000000..203d420 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/04/9C4ZIZ8X7JBGIGBI4EEZN3.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/10/ZDXMQX8ZM8OPQQG902WISP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/10/ZDXMQX8ZM8OPQQG902WISP.uasset new file mode 100644 index 0000000..e2af054 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/10/ZDXMQX8ZM8OPQQG902WISP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/AQ/VK33K8ICQRW2LSB7HJKMK5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/AQ/VK33K8ICQRW2LSB7HJKMK5.uasset new file mode 100644 index 0000000..a7842c1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/AQ/VK33K8ICQRW2LSB7HJKMK5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/HH/V0SHJB6K7O4D82K4CJM1UH.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/HH/V0SHJB6K7O4D82K4CJM1UH.uasset new file mode 100644 index 0000000..02e02ae Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/HH/V0SHJB6K7O4D82K4CJM1UH.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/IK/QBU1OAW5WYIY3SHPNS5ND3.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/IK/QBU1OAW5WYIY3SHPNS5ND3.uasset new file mode 100644 index 0000000..2654708 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/IK/QBU1OAW5WYIY3SHPNS5ND3.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/JH/CC5TV389S6YEPUPDUZF72M.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/JH/CC5TV389S6YEPUPDUZF72M.uasset new file mode 100644 index 0000000..3414aff Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/JH/CC5TV389S6YEPUPDUZF72M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/LF/5RTF1ME3ZUKIDV6780GR80.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/LF/5RTF1ME3ZUKIDV6780GR80.uasset new file mode 100644 index 0000000..6138eef Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/LF/5RTF1ME3ZUKIDV6780GR80.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/ME/84PUYCV1UTUC9OZMX68YVB.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/ME/84PUYCV1UTUC9OZMX68YVB.uasset new file mode 100644 index 0000000..b7ff106 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/ME/84PUYCV1UTUC9OZMX68YVB.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/RT/IRFJRGDHZV40CH0OBKENI1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/RT/IRFJRGDHZV40CH0OBKENI1.uasset new file mode 100644 index 0000000..d91bc65 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/RT/IRFJRGDHZV40CH0OBKENI1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/SO/AAC9DUJINC6CL8JGPTFQ9E.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/SO/AAC9DUJINC6CL8JGPTFQ9E.uasset new file mode 100644 index 0000000..b5a3ca9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/SO/AAC9DUJINC6CL8JGPTFQ9E.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/TV/2HEH2YJ0PSKAS3KOW3560W.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/TV/2HEH2YJ0PSKAS3KOW3560W.uasset new file mode 100644 index 0000000..dd667bc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/TV/2HEH2YJ0PSKAS3KOW3560W.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/UB/TOH31RBYPFXR7RJ460DCX2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/UB/TOH31RBYPFXR7RJ460DCX2.uasset new file mode 100644 index 0000000..12080b7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/UB/TOH31RBYPFXR7RJ460DCX2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/W6/7GSJBVYKUDI3PQ8XO1YKUY.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/W6/7GSJBVYKUDI3PQ8XO1YKUY.uasset new file mode 100644 index 0000000..2b35cf8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/W6/7GSJBVYKUDI3PQ8XO1YKUY.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/XU/23F2AFSYI3BLNA41VGTV1V.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/XU/23F2AFSYI3BLNA41VGTV1V.uasset new file mode 100644 index 0000000..36e1749 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/9/XU/23F2AFSYI3BLNA41VGTV1V.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/2L/P2C4J8VE988VMVWHA7ORM3.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/2L/P2C4J8VE988VMVWHA7ORM3.uasset new file mode 100644 index 0000000..75ed6de Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/2L/P2C4J8VE988VMVWHA7ORM3.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/2W/U0XT0R08XQA6C15NK8ILFA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/2W/U0XT0R08XQA6C15NK8ILFA.uasset new file mode 100644 index 0000000..12a66f9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/2W/U0XT0R08XQA6C15NK8ILFA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/7E/3ZF6PO2O7ZFWJ6D23A2IE3.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/7E/3ZF6PO2O7ZFWJ6D23A2IE3.uasset new file mode 100644 index 0000000..92ed8b5 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/7E/3ZF6PO2O7ZFWJ6D23A2IE3.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/AT/C0QMMRWWA38ZBNRK32T6LC.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/AT/C0QMMRWWA38ZBNRK32T6LC.uasset new file mode 100644 index 0000000..f00abb0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/AT/C0QMMRWWA38ZBNRK32T6LC.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/J9/VH9JRTC86FB0X2MTPKIRQM.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/J9/VH9JRTC86FB0X2MTPKIRQM.uasset new file mode 100644 index 0000000..2469ae1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/J9/VH9JRTC86FB0X2MTPKIRQM.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/KU/12YG9I1QW2GU72MG8QQX1K.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/KU/12YG9I1QW2GU72MG8QQX1K.uasset new file mode 100644 index 0000000..554da4f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/KU/12YG9I1QW2GU72MG8QQX1K.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/O0/LKDVUOZTZR54E0JOOLT8V9.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/O0/LKDVUOZTZR54E0JOOLT8V9.uasset new file mode 100644 index 0000000..2f74dd7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/O0/LKDVUOZTZR54E0JOOLT8V9.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/O6/VH2QCZ8SOT5UGJ5N2G09EU.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/O6/VH2QCZ8SOT5UGJ5N2G09EU.uasset new file mode 100644 index 0000000..36d74a3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/O6/VH2QCZ8SOT5UGJ5N2G09EU.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/OI/50SCSEIQX14LUEUR884AI1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/OI/50SCSEIQX14LUEUR884AI1.uasset new file mode 100644 index 0000000..4d11210 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/OI/50SCSEIQX14LUEUR884AI1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/PF/BF2ZZ1UBGHKETLSSYRDMFE.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/PF/BF2ZZ1UBGHKETLSSYRDMFE.uasset new file mode 100644 index 0000000..e4bbab9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/PF/BF2ZZ1UBGHKETLSSYRDMFE.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/PI/YTRN8SRE0WMZ87WF2GF94F.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/PI/YTRN8SRE0WMZ87WF2GF94F.uasset new file mode 100644 index 0000000..995969e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/PI/YTRN8SRE0WMZ87WF2GF94F.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/RJ/Z7CLKO8GGJ7RXH5PUAF4T4.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/RJ/Z7CLKO8GGJ7RXH5PUAF4T4.uasset new file mode 100644 index 0000000..4aa0edd Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/RJ/Z7CLKO8GGJ7RXH5PUAF4T4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/SP/7JREM1VH97CRIOVMGVTMPA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/SP/7JREM1VH97CRIOVMGVTMPA.uasset new file mode 100644 index 0000000..dadc371 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/SP/7JREM1VH97CRIOVMGVTMPA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/T5/B4E9IYD9K0ZSD2LPVFNNMP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/T5/B4E9IYD9K0ZSD2LPVFNNMP.uasset new file mode 100644 index 0000000..2ca5cc0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/T5/B4E9IYD9K0ZSD2LPVFNNMP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/UZ/22Y1VR58JGJMN265VZV9QF.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/UZ/22Y1VR58JGJMN265VZV9QF.uasset new file mode 100644 index 0000000..59c3afe Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/UZ/22Y1VR58JGJMN265VZV9QF.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/XJ/HL558UUAGCS9HVVOI0S7PX.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/XJ/HL558UUAGCS9HVVOI0S7PX.uasset new file mode 100644 index 0000000..7ff16f9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/A/XJ/HL558UUAGCS9HVVOI0S7PX.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/49/A1AM58FMS0TA32TVV28TWP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/49/A1AM58FMS0TA32TVV28TWP.uasset new file mode 100644 index 0000000..ee27c22 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/49/A1AM58FMS0TA32TVV28TWP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/51/6JKB4DNGJP09QUHY23FHRV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/51/6JKB4DNGJP09QUHY23FHRV.uasset new file mode 100644 index 0000000..1ebdca4 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/51/6JKB4DNGJP09QUHY23FHRV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/91/RN86NX0V8YXMYH68DMLHLT.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/91/RN86NX0V8YXMYH68DMLHLT.uasset new file mode 100644 index 0000000..2937b53 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/91/RN86NX0V8YXMYH68DMLHLT.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/98/QNEZKU3VNA595GSOD8OO37.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/98/QNEZKU3VNA595GSOD8OO37.uasset new file mode 100644 index 0000000..bf259c8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/98/QNEZKU3VNA595GSOD8OO37.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/9J/AXLMOZEL1YUX4QIENXAYWB.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/9J/AXLMOZEL1YUX4QIENXAYWB.uasset new file mode 100644 index 0000000..12a1f4a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/9J/AXLMOZEL1YUX4QIENXAYWB.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/DD/654T6CAPVSXAN1LXEX71EI.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/DD/654T6CAPVSXAN1LXEX71EI.uasset new file mode 100644 index 0000000..3bbb30e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/DD/654T6CAPVSXAN1LXEX71EI.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/EF/G3O7YJR3QU51OHQGRYB635.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/EF/G3O7YJR3QU51OHQGRYB635.uasset new file mode 100644 index 0000000..619568f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/EF/G3O7YJR3QU51OHQGRYB635.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/F3/3DXHSC9R4Q5S3VN1X9Y4L1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/F3/3DXHSC9R4Q5S3VN1X9Y4L1.uasset new file mode 100644 index 0000000..640d0ca Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/F3/3DXHSC9R4Q5S3VN1X9Y4L1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/FF/OYGGEWIPN674MWKLE4R3HY.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/FF/OYGGEWIPN674MWKLE4R3HY.uasset new file mode 100644 index 0000000..ee4e8cc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/FF/OYGGEWIPN674MWKLE4R3HY.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/IC/F2WIVCXDFR1VIQO0Z516RA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/IC/F2WIVCXDFR1VIQO0Z516RA.uasset new file mode 100644 index 0000000..c4fb8fc Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/IC/F2WIVCXDFR1VIQO0Z516RA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/MB/JY6JUB0I8NRFJEMJAPLJRT.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/MB/JY6JUB0I8NRFJEMJAPLJRT.uasset new file mode 100644 index 0000000..d5af986 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/MB/JY6JUB0I8NRFJEMJAPLJRT.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/O9/VN5JT11BVNPNMEHRB7KM1Y.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/O9/VN5JT11BVNPNMEHRB7KM1Y.uasset new file mode 100644 index 0000000..6a074a0 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/O9/VN5JT11BVNPNMEHRB7KM1Y.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/YQ/KT6JL4FVCNJJ9VFOCSF32J.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/YQ/KT6JL4FVCNJJ9VFOCSF32J.uasset new file mode 100644 index 0000000..b976981 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/YQ/KT6JL4FVCNJJ9VFOCSF32J.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/ZT/2NZ37LH6569S3RTV9OBOX5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/ZT/2NZ37LH6569S3RTV9OBOX5.uasset new file mode 100644 index 0000000..149f269 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/B/ZT/2NZ37LH6569S3RTV9OBOX5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/9I/67L4L3OQRV6UEZFNC6R4T9.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/9I/67L4L3OQRV6UEZFNC6R4T9.uasset new file mode 100644 index 0000000..db93621 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/9I/67L4L3OQRV6UEZFNC6R4T9.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/DX/7GG8NEI92LOIE1R4HUFSL5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/DX/7GG8NEI92LOIE1R4HUFSL5.uasset new file mode 100644 index 0000000..77699c7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/DX/7GG8NEI92LOIE1R4HUFSL5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/G9/BXOWHDAQV45A67SKV02PTQ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/G9/BXOWHDAQV45A67SKV02PTQ.uasset new file mode 100644 index 0000000..6ddf65a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/G9/BXOWHDAQV45A67SKV02PTQ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/L8/W9KXP403SB2GLGSMGNJ2X2.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/L8/W9KXP403SB2GLGSMGNJ2X2.uasset new file mode 100644 index 0000000..92bbfb3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/L8/W9KXP403SB2GLGSMGNJ2X2.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/NQ/7GSXHETYH1M5J8VEB5CX5U.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/NQ/7GSXHETYH1M5J8VEB5CX5U.uasset new file mode 100644 index 0000000..501d463 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/NQ/7GSXHETYH1M5J8VEB5CX5U.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/P8/0GJ9TLQE2YKOIFZ6YHG33H.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/P8/0GJ9TLQE2YKOIFZ6YHG33H.uasset new file mode 100644 index 0000000..1db8707 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/P8/0GJ9TLQE2YKOIFZ6YHG33H.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/TA/EVF0VF6G5TFVEERHOZ0TXO.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/TA/EVF0VF6G5TFVEERHOZ0TXO.uasset new file mode 100644 index 0000000..fc41c28 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/TA/EVF0VF6G5TFVEERHOZ0TXO.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/UT/H1YHK6GFA68LUEBAVP8VYX.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/UT/H1YHK6GFA68LUEBAVP8VYX.uasset new file mode 100644 index 0000000..4e1706e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/UT/H1YHK6GFA68LUEBAVP8VYX.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/VO/VMN4G7K3NKKV6F8HTPHHDB.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/VO/VMN4G7K3NKKV6F8HTPHHDB.uasset new file mode 100644 index 0000000..eb741c8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/VO/VMN4G7K3NKKV6F8HTPHHDB.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/XY/U8M6KOCPP9Z3CU7KA9W4D8.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/XY/U8M6KOCPP9Z3CU7KA9W4D8.uasset new file mode 100644 index 0000000..b95ac5c Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/C/XY/U8M6KOCPP9Z3CU7KA9W4D8.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/0W/E1FKEGVKGOLM7HGLQPCIPO.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/0W/E1FKEGVKGOLM7HGLQPCIPO.uasset new file mode 100644 index 0000000..8a7f150 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/0W/E1FKEGVKGOLM7HGLQPCIPO.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/IU/BUN3FU4E4T7WUW0L6Y1QVN.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/IU/BUN3FU4E4T7WUW0L6Y1QVN.uasset new file mode 100644 index 0000000..e9ee519 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/IU/BUN3FU4E4T7WUW0L6Y1QVN.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/LL/Z5LN9YZVYFSSGJNHVDZ5JN.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/LL/Z5LN9YZVYFSSGJNHVDZ5JN.uasset new file mode 100644 index 0000000..9c6ae1e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/LL/Z5LN9YZVYFSSGJNHVDZ5JN.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/VX/IAFFRTEPXDFRGLQNU3GO0M.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/VX/IAFFRTEPXDFRGLQNU3GO0M.uasset new file mode 100644 index 0000000..69568db Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/VX/IAFFRTEPXDFRGLQNU3GO0M.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/X6/ZFYQ9YY3AYVYTQVABNLSW1.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/X6/ZFYQ9YY3AYVYTQVABNLSW1.uasset new file mode 100644 index 0000000..f0a968e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/D/X6/ZFYQ9YY3AYVYTQVABNLSW1.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/05/6ZQKH5X74EC5HW9HZLMBZR.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/05/6ZQKH5X74EC5HW9HZLMBZR.uasset new file mode 100644 index 0000000..484305b Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/05/6ZQKH5X74EC5HW9HZLMBZR.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/1O/QEGEQ7QM8KRFZH57MI05U8.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/1O/QEGEQ7QM8KRFZH57MI05U8.uasset new file mode 100644 index 0000000..4c2cf63 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/1O/QEGEQ7QM8KRFZH57MI05U8.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/24/TTSF2XG4UDW3JK1CEJBTDJ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/24/TTSF2XG4UDW3JK1CEJBTDJ.uasset new file mode 100644 index 0000000..7929f0e Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/24/TTSF2XG4UDW3JK1CEJBTDJ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/3O/39BAOHFJ07B3TZJ99VF6TS.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/3O/39BAOHFJ07B3TZJ99VF6TS.uasset new file mode 100644 index 0000000..404aaff Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/3O/39BAOHFJ07B3TZJ99VF6TS.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/4P/161LQKE9OIBS7JD827YIYM.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/4P/161LQKE9OIBS7JD827YIYM.uasset new file mode 100644 index 0000000..68a1985 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/4P/161LQKE9OIBS7JD827YIYM.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/6V/1Z5IYU8LECZ26HT60HRHJR.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/6V/1Z5IYU8LECZ26HT60HRHJR.uasset new file mode 100644 index 0000000..3c060be Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/6V/1Z5IYU8LECZ26HT60HRHJR.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/7E/EKSJV0WLK3ZFBFN3AIMFSN.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/7E/EKSJV0WLK3ZFBFN3AIMFSN.uasset new file mode 100644 index 0000000..44bacac Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/7E/EKSJV0WLK3ZFBFN3AIMFSN.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/GV/DUB7U3WUV5NW5DMLGZTXHX.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/GV/DUB7U3WUV5NW5DMLGZTXHX.uasset new file mode 100644 index 0000000..f71d0b6 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/GV/DUB7U3WUV5NW5DMLGZTXHX.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/L5/XN411TQGE84MFL5YWF6O8U.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/L5/XN411TQGE84MFL5YWF6O8U.uasset new file mode 100644 index 0000000..3bcbcd9 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/L5/XN411TQGE84MFL5YWF6O8U.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/LQ/5WZQLJA63H2DNZDI0E1BWD.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/LQ/5WZQLJA63H2DNZDI0E1BWD.uasset new file mode 100644 index 0000000..58c356f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/LQ/5WZQLJA63H2DNZDI0E1BWD.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/MX/R1GV431P5FDO08OFULRA01.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/MX/R1GV431P5FDO08OFULRA01.uasset new file mode 100644 index 0000000..0bff8d7 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/MX/R1GV431P5FDO08OFULRA01.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/NI/BYD0CO9TOPLEZL5ONGPN6V.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/NI/BYD0CO9TOPLEZL5ONGPN6V.uasset new file mode 100644 index 0000000..91e770f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/NI/BYD0CO9TOPLEZL5ONGPN6V.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/OQ/6P6LHO9Y9PM9IUA75801I7.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/OQ/6P6LHO9Y9PM9IUA75801I7.uasset new file mode 100644 index 0000000..f9b9058 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/OQ/6P6LHO9Y9PM9IUA75801I7.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/TQ/NRWOYPD2GJEEO8YZ7EKURM.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/TQ/NRWOYPD2GJEEO8YZ7EKURM.uasset new file mode 100644 index 0000000..207d3e8 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/TQ/NRWOYPD2GJEEO8YZ7EKURM.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/UE/YUZ9741T50O1SYRX90OB0S.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/UE/YUZ9741T50O1SYRX90OB0S.uasset new file mode 100644 index 0000000..229c8bd Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/UE/YUZ9741T50O1SYRX90OB0S.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/UT/PNEB418QC0X5JOM1H6SBF5.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/UT/PNEB418QC0X5JOM1H6SBF5.uasset new file mode 100644 index 0000000..6b7ca20 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/UT/PNEB418QC0X5JOM1H6SBF5.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/V3/ICWLYCF62EJ63XTK5ZSZWV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/V3/ICWLYCF62EJ63XTK5ZSZWV.uasset new file mode 100644 index 0000000..3f9a52a Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/E/V3/ICWLYCF62EJ63XTK5ZSZWV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/0H/W713GG3LX62IM0K5KUTLHA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/0H/W713GG3LX62IM0K5KUTLHA.uasset new file mode 100644 index 0000000..86583cd Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/0H/W713GG3LX62IM0K5KUTLHA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/2F/0SPQG8P507LI9VUAFG20OA.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/2F/0SPQG8P507LI9VUAFG20OA.uasset new file mode 100644 index 0000000..52f5710 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/2F/0SPQG8P507LI9VUAFG20OA.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3J/YOJIUHFEEBEVIYVT32SXMP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3J/YOJIUHFEEBEVIYVT32SXMP.uasset new file mode 100644 index 0000000..7839533 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3J/YOJIUHFEEBEVIYVT32SXMP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3U/0UPUPW2AQ28MV36ETYAXYV.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3U/0UPUPW2AQ28MV36ETYAXYV.uasset new file mode 100644 index 0000000..665ee81 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3U/0UPUPW2AQ28MV36ETYAXYV.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3V/TTD2E2N0C0QHR88OVMV0NF.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3V/TTD2E2N0C0QHR88OVMV0NF.uasset new file mode 100644 index 0000000..47ffacf Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/3V/TTD2E2N0C0QHR88OVMV0NF.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/4W/VS2HCR44HZL16WKWIXMEAZ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/4W/VS2HCR44HZL16WKWIXMEAZ.uasset new file mode 100644 index 0000000..9b680df Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalActors__/FirstPerson/Maps/FirstPersonMap/F/4W/VS2HCR44HZL16WKWIXMEAZ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/1/KG/WXBHR5YF7EMN5ENSKZGERE.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/1/KG/WXBHR5YF7EMN5ENSKZGERE.uasset new file mode 100644 index 0000000..c1918ee Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/1/KG/WXBHR5YF7EMN5ENSKZGERE.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/3/BY/K2NKB37FY83282ZJ5Q84B9.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/3/BY/K2NKB37FY83282ZJ5Q84B9.uasset new file mode 100644 index 0000000..50e9231 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/3/BY/K2NKB37FY83282ZJ5Q84B9.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/5/68/DK3EWP7A4H1CU1MWJ4M3SR.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/5/68/DK3EWP7A4H1CU1MWJ4M3SR.uasset new file mode 100644 index 0000000..b3f9571 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/5/68/DK3EWP7A4H1CU1MWJ4M3SR.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/6/B8/RE8N15L5TGXIQNKLJO5ONQ.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/6/B8/RE8N15L5TGXIQNKLJO5ONQ.uasset new file mode 100644 index 0000000..84d215f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/6/B8/RE8N15L5TGXIQNKLJO5ONQ.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/6/VE/TF378B0L0V6R2E9RYZ61WK.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/6/VE/TF378B0L0V6R2E9RYZ61WK.uasset new file mode 100644 index 0000000..0082cc1 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/6/VE/TF378B0L0V6R2E9RYZ61WK.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/7/XG/B4XEEQD3M51IAE3XXUCIGI.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/7/XG/B4XEEQD3M51IAE3XXUCIGI.uasset new file mode 100644 index 0000000..101afa3 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/7/XG/B4XEEQD3M51IAE3XXUCIGI.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/8/GZ/HLVOPHTM7OXLOHRSPQA58F.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/8/GZ/HLVOPHTM7OXLOHRSPQA58F.uasset new file mode 100644 index 0000000..dbf9715 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/8/GZ/HLVOPHTM7OXLOHRSPQA58F.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/8/VP/Y4ZSWUEYWZONLRHQZAEHBX.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/8/VP/Y4ZSWUEYWZONLRHQZAEHBX.uasset new file mode 100644 index 0000000..d048433 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/8/VP/Y4ZSWUEYWZONLRHQZAEHBX.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/9/NP/OGSW48O49NB75KV3Y5NAUU.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/9/NP/OGSW48O49NB75KV3Y5NAUU.uasset new file mode 100644 index 0000000..f8cd35f Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/9/NP/OGSW48O49NB75KV3Y5NAUU.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/D/8K/1ROJX92K9L2TFU1NUE2DY4.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/D/8K/1ROJX92K9L2TFU1NUE2DY4.uasset new file mode 100644 index 0000000..ee1ca37 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/D/8K/1ROJX92K9L2TFU1NUE2DY4.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/E/D1/9XTHNJ7RYMHRDCEYQKNIYP.uasset b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/E/D1/9XTHNJ7RYMHRDCEYQKNIYP.uasset new file mode 100644 index 0000000..24caa46 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/__ExternalObjects__/FirstPerson/Maps/FirstPersonMap/E/D1/9XTHNJ7RYMHRDCEYQKNIYP.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/icons8-crosshair-24.uasset b/UE5/Cpp/G3NTs/Content/icons8-crosshair-24.uasset new file mode 100644 index 0000000..a014298 Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/icons8-crosshair-24.uasset differ diff --git a/UE5/Cpp/G3NTs/Content/icons8-crosshair-48.uasset b/UE5/Cpp/G3NTs/Content/icons8-crosshair-48.uasset new file mode 100644 index 0000000..db24c2d Binary files /dev/null and b/UE5/Cpp/G3NTs/Content/icons8-crosshair-48.uasset differ diff --git a/UE5/Cpp/G3NTs/LICENSE b/UE5/Cpp/G3NTs/LICENSE new file mode 100644 index 0000000..7b49cb2 --- /dev/null +++ b/UE5/Cpp/G3NTs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 G3NTs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/UE5/Cpp/G3NTs/Portal2.uproject b/UE5/Cpp/G3NTs/Portal2.uproject new file mode 100644 index 0000000..ee1a8c0 --- /dev/null +++ b/UE5/Cpp/G3NTs/Portal2.uproject @@ -0,0 +1,44 @@ +{ + "FileVersion": 3, + "EngineAssociation": "5.4", + "Category": "", + "Description": "", + "Modules": [ + { + "Name": "Portal2", + "Type": "Runtime", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine" + ] + } + ], + "Plugins": [ + { + "Name": "ModelingToolsEditorMode", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "VisualStudioTools", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/362651520df94e4fa65492dbcba44ae2", + "SupportedTargetPlatforms": [ + "Win64" + ] + }, + { + "Name": "GeometryScripting", + "Enabled": true + }, + { + "Name": "GeometryProcessing", + "Enabled": true + } + ], + "TargetPlatforms": [ + "Windows" + ] +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/README.md b/UE5/Cpp/G3NTs/README.md new file mode 100644 index 0000000..a5d6863 --- /dev/null +++ b/UE5/Cpp/G3NTs/README.md @@ -0,0 +1,51 @@ +# Unreal Engine 5.4.2 Portals Demo Game + +This repository contains the source code for a Portals Demo Game created in Unreal Engine 5.4.2 for CaptainCoder's Mechanically Challenged Game Jam. + +![Portal2-Win64-Shipping_5l0ktOkCR3](https://github.com/user-attachments/assets/0cced562-5725-4b3a-98c9-6fa418df7478) + +## Overview + +The game primarily utilizes C++ for the portal mechanics, with a small amount of C# and Blueprints where necessary. Each C++ function is documented using unreals documentation standard in both the `.hpp` and `.cpp` files. If you encounter any functions you don't understand, you can use Visual Studio's "Go to Definition" feature to view the source functions. + +This project assumes you have a decent level of experience with Unreal Engine and C++. It is designed to help you implement more complex features that work in cohesion with the portal teleportation mechanic, a common point where many tutorials conclude. + +## Features + +- **Portal Scene Capture to Texture Target** +- **Scene Capture Clip Plane**: Prevents the virtual camera from being obscured by walls. +- **Player/Object Teleportation** +- **Player/Object Clip Plane**: Prevents objects from sticking through portals. +- **Player/Object Cloning**: See yourself come out through the other side. +- **Player Control Rotation Fixes**: Addresses a common bug where control rotation and actor rotation needed to be unlinked. +- **Player Character Animation Syncing** +- **Portal Edge Colliders** +- **Portal Edge Color Options** +- **Portal Gun** +- **Portal Wall Placement with Edge Detection** +- **Portal Placement Rotations** +- **Portal Overlap Prevention** +- **Portal Surface Dynamic Collision Meshes** + +## Usage + +To use this Unreal Engine repository, follow these steps: + +1. Clone the repository to your local machine. +2. Open the project in Unreal Engine 5.4.2. +3. Build the project to compile the C++ code. +4. Explore the Blueprints and C# scripts for additional logic. + +note: This project uses many classes from the base first person demo from unreal engine. Some of these files have been modified. All unique original files can be found in the private and public sub folders. + +![ShareX_3gJETyfvy5](https://github.com/user-attachments/assets/d5dc9405-a50b-4d24-bb6c-d7a7563a802c) + +## Download + +You can download the latest build of the portal demo game [here](https://drive.google.com/file/d/1XQGadItVdYzw4-aQqdyhNw70yR_grIRX/view?usp=sharing). + +## Development Blog + +For a more detailed development blog, visit my portfolio website [here](https://g3nts.github.io/Portfolio-Web/Portal.html) WIP. + +![ShareX_zMdbyKClIh](https://github.com/user-attachments/assets/d87138ae-65ea-4282-82c8-5456593b7713) diff --git a/UE5/Cpp/G3NTs/Samples/PixelStreaming/WebServers/get_ps_servers.bat b/UE5/Cpp/G3NTs/Samples/PixelStreaming/WebServers/get_ps_servers.bat new file mode 100644 index 0000000..2549782 --- /dev/null +++ b/UE5/Cpp/G3NTs/Samples/PixelStreaming/WebServers/get_ps_servers.bat @@ -0,0 +1,203 @@ +@Rem Copyright Epic Games, Inc. All Rights Reserved. + +@echo off + +@Rem Set script location as working directory for commands. +pushd "%~dp0" + +@Rem Turned on delayed expansion so we have variables evaluated in nested scope +setlocal EnableDelayedExpansion + +@Rem Unset all our variables as these persist between cmd sessions if cmd not closed. +SET "PSInfraOrg=" +SET "PSInfraRepo=" +SET "PSInfraTagOrBranch=" +SET "ReleaseVersion=" +SET "ReleaseUrl=" +SET "IsTag=" +SET "RefType=" +SET "Url=" +SET "DownloadVersion=" +SET "FlagPassed=" + +:arg_loop_start +SET ARG=%1 +if DEFINED ARG ( + if "%ARG%"=="/h" ( + goto print_help + ) + if "%ARG%"=="/v" ( + SET UEVersion=%2 + SET FlagPassed=1 + SHIFT + ) + if "%ARG%"=="/b" ( + SET PSInfraTagOrBranch=%2 + SET IsTag=0 + SET FlagPassed=1 + SHIFT + ) + if "%ARG%"=="/t" ( + SET PSInfraTagOrBranch=%2 + SET IsTag=1 + SET FlagPassed=1 + SHIFT + ) + if "%ARG%"=="/r" ( + SET "ReleaseVersion=%2" + SET "ReleaseUrl=https://github.com/EpicGames/PixelStreamingInfrastructure/releases/download/!ReleaseVersion!/!ReleaseVersion!.zip" + SET IsTag=0 + SET FlagPassed=1 + SHIFT + ) + SHIFT + goto arg_loop_start +) + +@Rem Name and version of ps-infra that we are downloading +SET PSInfraOrg=EpicGames +SET PSInfraRepo=PixelStreamingInfrastructure + +@Rem If a UE version is supplied set the right branch or tag to fetch for that version of UE +if DEFINED UEVersion ( + if "%UEVersion%"=="4.26" ( + SET PSInfraTagOrBranch=UE4.26 + SET IsTag=0 + ) + if "%UEVersion%"=="4.27" ( + SET PSInfraTagOrBranch=UE4.27 + SET IsTag=0 + ) + if "%UEVersion%"=="5.0" ( + SET PSInfraTagOrBranch=UE5.0 + SET IsTag=0 + ) + if "%UEVersion%"=="5.1" ( + SET PSInfraTagOrBranch=UE5.1 + SET IsTag=0 + ) + if "%UEVersion%"=="5.2" ( + SET PSInfraTagOrBranch=UE5.2 + SET IsTag=0 + ) + if "%UEVersion%"=="5.3" ( + SET PSInfraTagOrBranch=UE5.3 + SET IsTag=0 + ) + if "%UEVersion%"=="5.4" ( + SET PSInfraTagOrBranch=UE5.4 + SET IsTag=0 + ) +) + +@Rem If no arguments select a specific version, fetch the appropriate default +if NOT DEFINED PSInfraTagOrBranch ( + SET PSInfraTagOrBranch=UE5.4 + SET IsTag=0 +) +echo Tag or branch: !PSInfraTagOrBranch! + +@Rem Whether the named reference is a tag or a branch affects the Url we fetch it on +if %IsTag%==1 ( + SET RefType=tags +) else ( + SET RefType=heads +) + +@Rem We have a branch, no user-specified release, then check repo for the presence of a RELEASE_VERSION file in the current branch +if %IsTag%==0 ( + if NOT DEFINED ReleaseUrl ( + @Rem We don't want to auto-set the release version if the user passed an explicit flag. + if NOT DEFINED FlagPassed ( + FOR /F "tokens=* USEBACKQ" %%F IN (`curl -s -f -L https://raw.githubusercontent.com/EpicGames/PixelStreamingInfrastructure/%PSInfraTagOrBranch%/RELEASE_VERSION`) DO ( + SET "ReleaseVersion=!PSInfraTagOrBranch!-%%F" + SET "ReleaseUrl=https://github.com/EpicGames/PixelStreamingInfrastructure/releases/download/!ReleaseVersion!/!ReleaseVersion!.zip" + ) + ) + ) +) + +@Rem Set our DownloadVersion here as we use this to check the contents of our DOWNLOAD_VERSION file shortly. +SET "DownloadVersion=%PSInfraTagOrBranch%" +if DEFINED ReleaseVersion ( + SET "DownloadVersion=!ReleaseVersion!" + echo Release: !ReleaseVersion! +) + +@Rem Check for the existence of a DOWNLOAD_VERSION file and if found, check its contents against our %DownloadVersion% +if exist DOWNLOAD_VERSION ( + + @Rem Read DOWNLOAD_VERSION file into variable + FOR /F "delims=" %%F IN ( DOWNLOAD_VERSION ) DO ( + SET "PreviousDownloadVersion=%%F" + @Rem Remove whitespace + SET "PreviousDownloadVersion=!PreviousDownloadVersion: =!" + ) + + if !DownloadVersion! == !PreviousDownloadVersion! ( + echo Downloaded version ^(!DownloadVersion!^) of PS infra matches release version ^(!PreviousDownloadVersion!^)...skipping install. + goto :EOF + ) else ( + echo There is a newer released version ^(!DownloadVersion!^) - had ^(!PreviousDownloadVersion!^), downloading... + ) +) else ( + echo DOWNLOAD_VERSION file not found...beginning ps-infra download. +) + +@Rem By default set the download url to the .zip of the branch +SET Url=https://github.com/%PSInfraOrg%/%PSInfraRepo%/archive/refs/%RefType%/%PSInfraTagOrBranch%.zip + +@Rem If we have a ReleaseUrl then set it to our download url +if DEFINED ReleaseUrl ( + SET Url=!ReleaseUrl! +) + +@Rem Download ps-infra and follow redirects. +echo Attempting downloading Pixel Streaming infrastructure from: !Url! +curl -L !Url! > ps-infra.zip + +@Rem Unarchive the .zip +tar -xmf ps-infra.zip || echo bad archive, contents: && type ps-infra.zip && exit 0 + +@Rem Remove old infra +if exist Frontend\ ( rmdir /s /q Frontend ) +if exist Matchmaker\ ( rmdir /s /q Matchmaker ) +if exist SignallingWebserver\ ( rmdir /s /q SignallingWebserver ) +if exist SFU\ ( rmdir /s /q SFU ) + +@Rem Rename the extracted, versioned, directory +for /d %%i in ("PixelStreamingInfrastructure-*") do ( + for /d %%j in ("%%i/*") do ( + echo "%%i\%%j" + move "%%i\%%j" . + ) + for %%j in ("%%i/*") do ( + echo "%%i\%%j" + move "%%i\%%j" . + ) + + echo "%%i" + rmdir /s /q "%%i" +) + +@Rem Delete the downloaded zip +del ps-infra.zip + +@Rem Create a DOWNLOAD_VERSION file, which we use as a comparison file to check if we should auto upgrade when these scripts are run again +echo %DownloadVersion%> DOWNLOAD_VERSION +goto :EOF + +:print_help +echo. +echo Tool for fetching PixelStreaming Infrastructure. If no flags are set specifying a version to fetch, +echo the recommended version will be chosen as a default. +echo. +echo Usage: +echo %~n0%~x0 [^/h] [^/v ^] [^/b ^] [^/t ^] [^/r ^] +echo Where: +echo /v Specify a version of Unreal Engine to download the recommended release for +echo /b Specify a specific branch for the tool to download from repo +echo /t Specify a specific tag for the tool to download from repo +echo /r Specify a specific release url path e.g. https://github.com/EpicGames/PixelStreamingInfrastructure/releases/download/${RELEASE_HERE}.zip +echo /h Display this help message +goto :EOF \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Samples/PixelStreaming/WebServers/get_ps_servers.sh b/UE5/Cpp/G3NTs/Samples/PixelStreaming/WebServers/get_ps_servers.sh new file mode 100644 index 0000000..e0217a7 --- /dev/null +++ b/UE5/Cpp/G3NTs/Samples/PixelStreaming/WebServers/get_ps_servers.sh @@ -0,0 +1,184 @@ +#!/bin/bash +# Copyright Epic Games, Inc. All Rights Reserved. + +BASH_LOCATION="$(cd -P -- "$(dirname -- "$0")" && pwd -P)" + +pushd "${BASH_LOCATION}" > /dev/null + +print_help() { + echo " + Tool for fetching PixelStreaming Infrastructure. If no flags are set specifying a version to fetch, + the recommended version will be chosen as a default. + + Usage: + ${0} [-h] [-v ] [-b ] [-t ] + Where: + -v Specify a version of Unreal Engine to download the recommended + release for + -b Specify a specific branch for the tool to download from repo + -t Specify a specific tag for the tool to download from repo + -r Specify a specific release url path e.g. https://github.com/EpicGames/PixelStreamingInfrastructure/releases/download//.zip + -h Display this help message +" + exit 1 +} + +# Set all default variables (e.g. # Name and version of ps-infra that we are downloading) +PSInfraOrg=EpicGames +PSInfraRepo=PixelStreamingInfrastructure +PSInfraTagOrBranch=UE5.4 +RefType=heads +IsTag=0 +ReleaseUrlBase=https://github.com/EpicGames/PixelStreamingInfrastructure/releases/download +# Unset any variables that don't have defaults that we use that may have persisted between bash terminals. +unset Url +unset DownloadVersion +unset FlagPassed +unset ReleaseVersion +unset ReleaseUrl + +while (($#)) ; do + case "$1" in + -h ) print_help;; + -v ) UEVersion="$2"; FlagPassed=1; shift 2;; + -b ) PSInfraTagOrBranch="$2"; FlagPassed=1; IsTag=0; shift 2;; + -t ) PSInfraTagOrBranch="$2"; FlagPassed=1; IsTag=1; shift 2;; + -r ) ReleaseVersion="$2"; FlagPassed=1; IsTag=0; ReleaseUrl=$ReleaseUrlBase/$ReleaseVersion/$ReleaseVersion.tar.gz; shift 2;; + * ) echo "Unknown command: $1"; shift;; + esac + done + +# If a UE version is supplied set the right branch or tag to fetch for that version of UE +if [ ! -z "$UEVersion" ] +then + if [ "$UEVersion" = "4.26" ] + then + PSInfraTagOrBranch=UE4.26 + IsTag=0 + fi + if [ "$UEVersion" = "4.27" ] + then + PSInfraTagOrBranch=UE4.27 + IsTag=0 + fi + if [ "$UEVersion" = "5.0" ] + then + PSInfraTagOrBranch=UE5.0 + IsTag=0 + fi + if [ "$UEVersion" = "5.1" ] + then + PSInfraTagOrBranch=UE5.1 + IsTag=0 + fi + if [ "$UEVersion" = "5.2" ] + then + PSInfraTagOrBranch=UE5.2 + IsTag=0 + fi + if [ "$UEVersion" = "5.3" ] + then + PSInfraTagOrBranch=UE5.3 + IsTag=0 + fi + if [ "$UEVersion" = "5.4" ] + then + PSInfraTagOrBranch=UE5.4 + IsTag=0 + fi +fi + +# If no arguments select a specific version, fetch the appropriate default +if [ -z "$PSInfraTagOrBranch" ] +then + PSInfraTagOrBranch=UE5.4 + IsTag=0 +fi +echo "Tag or branch: $PSInfraTagOrBranch" + +# Whether the named reference is a tag or a branch affects the Url we fetch it on +if [ "$IsTag" -eq 1 ] +then + RefType=tags +else + RefType=heads +fi + +# We have a branch, no user-specified release, then check repo for the presence of a RELEASE_VERSION file in the current branch. +if [ "$IsTag" -eq 0 ] && [ -z "$ReleaseUrl" ] && [ -z "$FlagPassed" ] +then + RelUrl=https://raw.githubusercontent.com/EpicGames/PixelStreamingInfrastructure/$PSInfraTagOrBranch/RELEASE_VERSION + if curl --output /dev/null --silent -r 0-0 --fail "$RelUrl"; then + ReleaseVersion="$PSInfraTagOrBranch-$(curl -L -s $RelUrl)" + ReleaseUrl=https://github.com/EpicGames/PixelStreamingInfrastructure/releases/download/$ReleaseVersion/$ReleaseVersion.tar.gz + echo "Valid RELEASE_VERSION file found in Github repo at $RelUrl" + else + echo "RELEASE_VERSION file does not exist at: $RelUrl" + fi +else + echo "Skipping downloading RELEASE_VERSION file." +fi + +#Set our DownloadVersion here as we use this to check the contents of our DOWNLOAD_VERSION file shortly. +DownloadVersion="$PSInfraTagOrBranch" +if [ ! -z "$ReleaseVersion" ] +then + DownloadVersion="$ReleaseVersion" + echo "Release: $ReleaseVersion" +fi + +#Rem Check for the existence of a DOWNLOAD_VERSION file and if found, check its contents against our $DownloadVersion +if test -f DOWNLOAD_VERSION; +then + PREVIOUS_DOWNLOAD_VERSION=$(cat DOWNLOAD_VERSION) + if [ "$DownloadVersion" = "$PREVIOUS_DOWNLOAD_VERSION" ] + then + echo "Downloaded version ($DownloadVersion) of PS infra matches release version ($PREVIOUS_DOWNLOAD_VERSION)...skipping install." + exit 0 + else + echo "There is a newer released version ($DownloadVersion) - had ($PREVIOUS_DOWNLOAD_VERSION), downloading..." + #Remove old infra + rm -rf Frontend + rm -rf Matchmaker + rm -rf SignallingWebServer + rm -rf SFU + fi +else + echo "DOWNLOAD_VERSION file not found..." +fi + +# Pre-download - Set the download url to the .zip of the branch +Url=https://github.com/$PSInfraOrg/$PSInfraRepo/archive/refs/$RefType/$PSInfraTagOrBranch.tar.gz + +#Check if ReleaseUrl is valid by CURLing with fail fast and if success then set it to our download url +if [ ! -z "$ReleaseUrl" ] +then + echo "Checking if release url is valid, url: $ReleaseUrl" + if curl --output /dev/null --silent -r 0-0 --fail "$ReleaseUrl"; then + echo "Valid release url at: $ReleaseUrl" + Url=$ReleaseUrl + else + echo "Invalid Github release url: $ReleaseUrl" + exit 1 + fi +fi + +# Download - download ps-infra and follow redirects. +echo "Beginning ps-infra download from: $Url" +curl -L $Url > ps-infra.tar.gz + +# Unarchive the .tar +tar -xmf ps-infra.tar.gz || $(echo "bad archive, contents:" && head --lines=20 ps-infra.tar.gz && exit 0) + +# Move the server folders into the current directory (WebServers) and delete the original directory +mv PixelStreamingInfrastructure-*/* . +# Copy any files and folders beginning with dot (ignored by * glob) and discard errors regarding to not being able to move "." and ".." +mv PixelStreamingInfrastructure-*/.* . 2>/dev/null || : +rm -rf PixelStreamingInfrastructure-* + +# Delete the downloaded tar +rm ps-infra.tar.gz + +#Create a DOWNLOAD_VERSION file, which we use as a comparison file to check if we should auto upgrade when these scripts are run again +echo "$DownloadVersion" >| DOWNLOAD_VERSION +exit 0 \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2.Target.cs b/UE5/Cpp/G3NTs/Source/Portal2.Target.cs new file mode 100644 index 0000000..d18a9df --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2.Target.cs @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; +using System.Collections.Generic; + +public class Portal2Target : TargetRules +{ + public Portal2Target(TargetInfo Target) : base(Target) + { + Type = TargetType.Game; + DefaultBuildSettings = BuildSettingsVersion.V5; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_4; + ExtraModuleNames.Add("Portal2"); + } +} diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2.Build.cs b/UE5/Cpp/G3NTs/Source/Portal2/Portal2.Build.cs new file mode 100644 index 0000000..82d31bb --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2.Build.cs @@ -0,0 +1,50 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +//using UnrealBuildTool; + +//public class Portal2 : ModuleRules +//{ +// public Portal2(ReadOnlyTargetRules Target) : base(Target) +// { +// PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + +// PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" }); +// } +//} + +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; + +public class Portal2 : ModuleRules +{ + public Portal2(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] + { + "Core", + "CoreUObject", + "Engine", + "InputCore", + "EnhancedInput", + "Niagara", + "GeometryFramework", + "GeometryCore", + "DynamicMesh" + }); + + PrivateDependencyModuleNames.AddRange(new string[] + { + }); + + // Uncomment if you are using Slate UI + // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); + + // Uncomment if you are using online features + // PrivateDependencyModuleNames.Add("OnlineSubsystem"); + + // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true + } +} diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Portal2.cpp new file mode 100644 index 0000000..50b448e --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2.cpp @@ -0,0 +1,7 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "Portal2.h" +#include "Modules/ModuleManager.h" + +IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, Portal2, "Portal2" ); + \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2.h b/UE5/Cpp/G3NTs/Source/Portal2/Portal2.h new file mode 100644 index 0000000..ddbf2e2 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2.h @@ -0,0 +1,5 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2Character.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Character.cpp new file mode 100644 index 0000000..ee320b6 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Character.cpp @@ -0,0 +1,105 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "Portal2Character.h" +#include "Portal2Projectile.h" +#include "Animation/AnimInstance.h" +#include "Camera/CameraComponent.h" +#include "Components/CapsuleComponent.h" +#include "Components/SkeletalMeshComponent.h" +#include "EnhancedInputComponent.h" +#include "EnhancedInputSubsystems.h" +#include "InputActionValue.h" +#include "Engine/LocalPlayer.h" + +DEFINE_LOG_CATEGORY(LogTemplateCharacter); + +////////////////////////////////////////////////////////////////////////// +// APortal2Character + +APortal2Character::APortal2Character() +{ + // Set size for collision capsule + GetCapsuleComponent()->InitCapsuleSize(30.f, 90.0f); + + // Create a CameraComponent + FirstPersonCameraComponent = CreateDefaultSubobject(TEXT("FirstPersonCamera")); + FirstPersonCameraComponent->SetupAttachment(GetCapsuleComponent()); + FirstPersonCameraComponent->SetRelativeLocation(FVector(-10.f, 0.f, 60.f)); // Position the camera + FirstPersonCameraComponent->bUsePawnControlRotation = true; + + // Create a mesh component that will be used when being viewed from a '1st person' view (when controlling this pawn) + Mesh1P = CreateDefaultSubobject(TEXT("CharacterMesh1P")); + Mesh1P->SetOnlyOwnerSee(true); + Mesh1P->SetupAttachment(FirstPersonCameraComponent); + Mesh1P->bCastDynamicShadow = false; + Mesh1P->CastShadow = false; + Mesh1P->SetRelativeLocation(FVector(-30.f, 0.f, -150.f)); +} + +void APortal2Character::BeginPlay() +{ + // Call the base class + Super::BeginPlay(); +} + +//////////////////////////////////////////////////////////////////////////// Input + +void APortal2Character::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + // Jumping + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping); + + // Moving + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &APortal2Character::Move); + + // Looking + EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &APortal2Character::Look); + } + else + { + UE_LOG(LogTemplateCharacter, Error, TEXT("'%s' Failed to find an Enhanced Input Component! This template is built to use the Enhanced Input system. If you intend to use the legacy system, then you will need to update this C++ file."), *GetNameSafe(this)); + } +} + + +void APortal2Character::Move(const FInputActionValue& Value) +{ + // input is a Vector2D + FVector2D MovementVector = Value.Get(); + + if (Controller != nullptr) + { + FRotator ControlRotation = Controller->GetControlRotation(); + + // Constrain control rotation to the horizontal plane (ignore pitch) + FRotator YawRotation(0, ControlRotation.Yaw, 0); + + // Get forward and right vectors from the control rotation + FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); + FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); + + // Add movement input based on control rotation + AddMovementInput(ForwardDirection, MovementVector.Y); + AddMovementInput(RightDirection, MovementVector.X); + // add movement + //AddMovementInput(GetActorForwardVector(), MovementVector.Y); + //AddMovementInput(GetActorRightVector(), MovementVector.X); + } +} + +void APortal2Character::Look(const FInputActionValue& Value) +{ + // input is a Vector2D + FVector2D LookAxisVector = Value.Get(); + + if (Controller != nullptr) + { + // add yaw and pitch input to controller + AddControllerYawInput(LookAxisVector.X); + AddControllerPitchInput(LookAxisVector.Y); + } +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2Character.h b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Character.h new file mode 100644 index 0000000..368ce31 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Character.h @@ -0,0 +1,72 @@ +// Copyright Epic Games, Inc. All Rights Reserved. +// Modified version of the Epic Games character class + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "Logging/LogMacros.h" +#include "Portal2Character.generated.h" + +class UInputComponent; +class USkeletalMeshComponent; +class UCameraComponent; +class UInputAction; +class UInputMappingContext; +struct FInputActionValue; + +DECLARE_LOG_CATEGORY_EXTERN(LogTemplateCharacter, Log, All); + +UCLASS(config=Game) +class APortal2Character : public ACharacter +{ + GENERATED_BODY() + + /** Pawn mesh: 1st person view (arms; seen only by self) */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Mesh, meta = (AllowPrivateAccess = "true")) + USkeletalMeshComponent* Mesh1P; + + /** First person camera */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true")) + UCameraComponent* FirstPersonCameraComponent; + + /** Jump Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) + UInputAction* JumpAction; + + /** Move Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) + UInputAction* MoveAction; + +public: + APortal2Character(); + +protected: + virtual void BeginPlay(); + +public: + + /** Look Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) + class UInputAction* LookAction; + +protected: + /** Called for movement input */ + void Move(const FInputActionValue& Value); + + /** Called for looking input */ + void Look(const FInputActionValue& Value); + +protected: + // APawn interface + virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override; + // End of APawn interface + +public: + /** Returns Mesh1P subobject **/ + USkeletalMeshComponent* GetMesh1P() const { return Mesh1P; } + /** Returns FirstPersonCameraComponent subobject **/ + UCameraComponent* GetFirstPersonCameraComponent() const { return FirstPersonCameraComponent; } + +}; + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2GameMode.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Portal2GameMode.cpp new file mode 100644 index 0000000..45e0c46 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2GameMode.cpp @@ -0,0 +1,14 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "Portal2GameMode.h" +#include "Portal2Character.h" +#include "UObject/ConstructorHelpers.h" + +APortal2GameMode::APortal2GameMode() + : Super() +{ + // set default pawn class to our Blueprinted character + static ConstructorHelpers::FClassFinder PlayerPawnClassFinder(TEXT("/Game/FirstPerson/Blueprints/BP_FirstPersonCharacter")); + DefaultPawnClass = PlayerPawnClassFinder.Class; + +} diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2GameMode.h b/UE5/Cpp/G3NTs/Source/Portal2/Portal2GameMode.h new file mode 100644 index 0000000..75afab6 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2GameMode.h @@ -0,0 +1,19 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "Portal2GameMode.generated.h" + +UCLASS(minimalapi) +class APortal2GameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + APortal2GameMode(); +}; + + + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2PlayerController.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Portal2PlayerController.cpp new file mode 100644 index 0000000..9603a18 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2PlayerController.cpp @@ -0,0 +1,18 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Portal2PlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "Engine/LocalPlayer.h" + +void APortal2PlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // get the enhanced input subsystem + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + // add the mapping context so we get controls + Subsystem->AddMappingContext(InputMappingContext, 0); + } +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2PlayerController.h b/UE5/Cpp/G3NTs/Source/Portal2/Portal2PlayerController.h new file mode 100644 index 0000000..3840645 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2PlayerController.h @@ -0,0 +1,31 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "Portal2PlayerController.generated.h" + +class UInputMappingContext; + +/** + * + */ +UCLASS() +class PORTAL2_API APortal2PlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Input Mapping Context to be used for player input */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input) + UInputMappingContext* InputMappingContext; + + // Begin Actor interface +protected: + + virtual void BeginPlay() override; + + // End Actor interface +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2Projectile.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Projectile.cpp new file mode 100644 index 0000000..eab21c0 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Projectile.cpp @@ -0,0 +1,43 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "Portal2Projectile.h" +#include "GameFramework/ProjectileMovementComponent.h" +#include "Components/SphereComponent.h" + +APortal2Projectile::APortal2Projectile() +{ + // Use a sphere as a simple collision representation + CollisionComp = CreateDefaultSubobject(TEXT("SphereComp")); + CollisionComp->InitSphereRadius(5.0f); + CollisionComp->BodyInstance.SetCollisionProfileName("Projectile"); + CollisionComp->OnComponentHit.AddDynamic(this, &APortal2Projectile::OnHit); // set up a notification for when this component hits something blocking + + // Players can't walk on it + CollisionComp->SetWalkableSlopeOverride(FWalkableSlopeOverride(WalkableSlope_Unwalkable, 0.f)); + CollisionComp->CanCharacterStepUpOn = ECB_No; + + // Set as root component + RootComponent = CollisionComp; + + // Use a ProjectileMovementComponent to govern this projectile's movement + ProjectileMovement = CreateDefaultSubobject(TEXT("ProjectileComp")); + ProjectileMovement->UpdatedComponent = CollisionComp; + ProjectileMovement->InitialSpeed = 3000.f; + ProjectileMovement->MaxSpeed = 3000.f; + ProjectileMovement->bRotationFollowsVelocity = true; + ProjectileMovement->bShouldBounce = true; + + // Die after 3 seconds by default + InitialLifeSpan = 3.0f; +} + +void APortal2Projectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) +{ + // Only add impulse and destroy projectile if we hit a physics + if ((OtherActor != nullptr) && (OtherActor != this) && (OtherComp != nullptr) && OtherComp->IsSimulatingPhysics()) + { + OtherComp->AddImpulseAtLocation(GetVelocity() * 100.0f, GetActorLocation()); + + Destroy(); + } +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Portal2Projectile.h b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Projectile.h new file mode 100644 index 0000000..a99b8f2 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Portal2Projectile.h @@ -0,0 +1,40 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "GameFramework/ProjectileMovementComponent.h" +#include "Portal2Projectile.generated.h" + +class USphereComponent; + +UCLASS(config=Game) +class APortal2Projectile : public AActor +{ + GENERATED_BODY() + + /** Sphere collision component */ + UPROPERTY(VisibleDefaultsOnly, Category=Projectile) + USphereComponent* CollisionComp; + +public: + /** Projectile movement component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Movement, meta = (AllowPrivateAccess = "true")) + UProjectileMovementComponent* ProjectileMovement; + +public: + APortal2Projectile(); + + /** called when projectile hits something */ + UFUNCTION() + void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); + + /** Returns CollisionComp subobject **/ + USphereComponent* GetCollisionComp() const { return CollisionComp; } + /** Returns ProjectileMovement subobject **/ + UProjectileMovementComponent* GetProjectileMovement() const { return ProjectileMovement; } + //FVector GetProjectileMovementVelocity() { return ProjectileMovement->ComputeVelocity(); } + void SetProjectileMovement(FVector VelocityIn) { ProjectileMovement->Velocity = VelocityIn; } +}; + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/DebugDisplay.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/DebugDisplay.cpp new file mode 100644 index 0000000..c8ce379 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/DebugDisplay.cpp @@ -0,0 +1,74 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "DebugDisplay.h" + +// Sets default values +ADebugDisplay::ADebugDisplay() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = true; + bHasLineOfSightPortalOne = false; + bCapturedSceneLastFrame = false; + bCanTeleportNextUpdate = false; + bHasTeleported = false; + bTeleportTest = false; + + X = 0; + Y = 0; + Z = 0; + + rotX = 0; + rotY = 0; + rotZ = 0; + + PDot = 0; + + bTick = false; +} + +// Called when the game starts or when spawned +void ADebugDisplay::BeginPlay() +{ + Super::BeginPlay(); + +} + +// Called every frame +void ADebugDisplay::Tick(float DeltaTime) +{ + Super::Tick(DeltaTime); + + if (bTick == false) + { + return; + } + + number++; + if (number >= 99999) + { + number = 0; + } + + if (bHasTeleported) + { + number2++; + } + if (number2 >= 100) + { + number2 = 0; + bHasTeleported = false; + } + + if (GEngine) + { + GEngine->AddOnScreenDebugMessage(1, 1.f, FColor::White, FString::Printf(TEXT("Tick Counter: %d"), number)); + GEngine->AddOnScreenDebugMessage(2, 1.f, FColor::White, FString::Printf(TEXT("Has Line of Sight: %s"), bHasLineOfSightPortalOne ? TEXT("true") : TEXT("false"))); + GEngine->AddOnScreenDebugMessage(3, 1.f, FColor::White, FString::Printf(TEXT("Captured Scene Last Frame: %s"), bCapturedSceneLastFrame ? TEXT("true") : TEXT("false"))); + GEngine->AddOnScreenDebugMessage(4, 1.f, FColor::White, FString::Printf(TEXT("Object Ready for Teleport: %s"), bCanTeleportNextUpdate ? TEXT("true") : TEXT("false"))); + GEngine->AddOnScreenDebugMessage(5, 1.f, FColor::White, FString::Printf(TEXT("Object Teleported: %s"), bHasTeleported ? TEXT("true") : TEXT("false"))); + GEngine->AddOnScreenDebugMessage(6, 1.f, FColor::White, FString::Printf(TEXT("Player inside collider box: %s"), bTeleportTest ? TEXT("true") : TEXT("false"))); + GEngine->AddOnScreenDebugMessage(8, 1.f, FColor::White, FString::Printf(TEXT("Portal plane dot: %f"), PDot)); + } +} + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/MyAnimInstance.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/MyAnimInstance.cpp new file mode 100644 index 0000000..6f4f48b --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/MyAnimInstance.cpp @@ -0,0 +1,19 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "MyAnimInstance.h" + +void UMyAnimInstance::SetAnimationPosition(float TimePosition) +{ + // Assuming you are dealing with a single animation sequence + // Get the active montage or animation sequence + UAnimMontage* CurrentMontage = GetCurrentActiveMontage(); + if (CurrentMontage) + { + Montage_SetPosition(CurrentMontage, TimePosition); + } + else + { + UE_LOG(LogTemp, Warning, TEXT("--- No Montage ---")); + } +} diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/Portal3Manager.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/Portal3Manager.cpp new file mode 100644 index 0000000..813df92 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/Portal3Manager.cpp @@ -0,0 +1,1054 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Portal3Manager.h" +#include "C:/Users/G3NTs/Documents/Unreal Projects/Portal2/Source/Portal2/Portal2Projectile.h" +#include "C:/Users/G3NTs/Documents/Unreal Projects/Portal2/Source/Portal2/Portal2Character.h" +#include "C:/Users/G3NTs/Documents/Unreal Projects/Portal2/Source/Portal2/TP_WeaponComponent.h" +#include "Camera/CameraComponent.h" +#include "EnhancedInputComponent.h" +#include "GameFramework/Pawn.h" +#include "GameFramework/Controller.h" +#include "EnhancedInputSubsystems.h" +#include "MyAnimInstance.h" +#include "Animation/AnimInstance.h" +#include "Components/BoxComponent.h" +#include "Components/CapsuleComponent.h" +#include "PortalSurface.h" +#include "SceneView.h" + +APortal3Manager::APortal3Manager() +{ + PrimaryActorTick.bCanEverTick = true; + PrimaryActorTick.TickGroup = TG_PostUpdateWork; + + SecondaryActorTick.bCanEverTick = true; + SecondaryActorTick.TickGroup = TG_PostPhysics; + + bCloneState = false; +} + +void APortal3Manager::BeginPlay() +{ + Super::BeginPlay(); + + PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0); + + // problem for shipping build: viewport size is zero for first view frames + UpdateViewportSize(); +} + +void APortal3Manager::RegisterActorTickFunctions(bool bRegister) +{ + Super::RegisterActorTickFunctions(bRegister); + + /* + * Two Tick functions are registered, we run different functions at different steps between frames. + * This fixes several issues related to update delays with the portal scene capture components + */ + if (bRegister) + { + if (SecondaryActorTick.bCanEverTick) + { + SecondaryActorTick.Target = this; + SecondaryActorTick.RegisterTickFunction(GetLevel()); + } + } + else + { + if (SecondaryActorTick.IsTickFunctionRegistered()) + { + SecondaryActorTick.UnRegisterTickFunction(); + } + } +} + +void APortal3Manager::TickActor(float DeltaSeconds, ELevelTick TickType, FActorTickFunction& ThisTickFunction) +{ + Super::TickActor(DeltaSeconds, TickType, ThisTickFunction); + + /* + * Teleportation checks are done before any updates of the Scenecapture components. + */ + if (ThisTickFunction.TickGroup == TG_PostPhysics) + { + TeleportActorsCheck(); + } + else if (ThisTickFunction.TickGroup == TG_PostUpdateWork) + { + CloneOrUpdateAllActors(); + ResetRotationControllerSlerp(DeltaSeconds); + UpdatePortals(); + } +} + +/** + * Finds all actors of a specified subclass in the world that inherit from a given base class. + * This function uses UGameplayStatics::GetAllActorsOfClass to gather all actors of the specified BaseClass, + * then attempts to cast each found actor to SubClass. If successful, it adds the casted actor pointer to + * an array which is returned at the end. + * + * @tparam SubClass The subclass of AActor to search for. + * @param World The world context to search for actors. + * @param BaseClass The base class from which SubClass inherits. + * @return An array of pointers to actors of SubClass found in the world. May be empty if none are found. + */ +template +TArray APortal3Manager::FindAllActorsInWorld(UWorld* World, TSubclassOf BaseClass) +{ + TArray ActorList; + TArray Actors; + UGameplayStatics::GetAllActorsOfClass(World, BaseClass, Actors); + + for (AActor* Actor : Actors) + { + if (SubClass* ActorSubclass = Cast(Actor)) + { + ActorList.Add(ActorSubclass); + } + else + { + UE_LOG(LogTemp, Error, TEXT("Casting BaseClass Actor to SubClass Failed! - Make sure to set the correct BaseClass")); + } + } + + return ActorList; +} + +/** + * Updates the capture state of all portals in the PortalList. + * + * This function iterates through each portal in the PortalList and checks if the portal has a linked portal. + * If a linked portal is found, it calculates the necessary transforms and updates the portal's screen capture + * to reflect the current state of the camera relative to the portal and its linked portal. + */ +void APortal3Manager::UpdatePortals() +{ + for (APortalV3* Portal : PortalList) + { + if (Portal->LinkedPortal == nullptr) + { + Portal->NullScreenCapture(); + continue; + } + + FTransform PortalTransform = Portal->GetActorTransform(); + FTransform CameraTransform = PlayerController->PlayerCameraManager->GetTransform(); + + if (CheckPortalNeedsUpdate(Portal, PortalTransform, CameraTransform)) + { + FTransform TargetTransform = Portal->LinkedPortal->GetActorTransform(); + + UpdatePortalCapture(Portal, PortalTransform, TargetTransform, CameraTransform); + } + } +} + +/** + * Updates the screen capture for the specified portal. + * + * This function calculates the new capture location and rotation for the portal based on the provided + * reference, target, and camera transforms. It then retrieves the camera's view projection and projection + * matrices, and uses these values to update the portal's screen capture. + * + * @param Portal The portal to update. + * @param Reference The reference transform used for coordinate conversion, the main portal. + * @param Target The transform of the linked portal. + * @param Camera The current transform of the camera. + */ +void APortal3Manager::UpdatePortalCapture(APortalV3* Portal, FTransform Reference, FTransform Target, FTransform Camera) +{ + APlayerCameraManager* CameraManager = PlayerController->PlayerCameraManager; + + FVector CaptureLocation = ConvertLocationToActorSpace(Camera, Reference, Target); + FQuat CaptureRotation = ConvertRotationToActorSpace(Camera, Reference, Target); + FMatrix ViewProjectionMatrix = GetCameraProjectionMatrix(CameraManager, true); + FMatrix ProjectionMatrix = GetCameraProjectionMatrix(CameraManager, false); + + Portal->UpdateScreenCapture(CaptureLocation, CaptureRotation , ViewProjectionMatrix, Target, ProjectionMatrix); +} + +/** + * Checks and manages teleportation for each agent in the TeleportAgents map. + * Iterates through each agent and evaluates its position relative to portals in the PortalList. + * Manages teleportation status, collision settings, and clip plane for each teleport agent. + */ +void APortal3Manager::TeleportActorsCheck() +{ + for (TPair& Pair : TeleportAgents) + { + AActor* Agent = Pair.Value; // sometimes creates a nullptr error, no clue why. temporary fix: skip it... + if (Agent == nullptr) + { + UE_LOG(LogTemp, Warning, TEXT("TeleportAgents Length: %d"), TeleportAgents.Num()) + continue; + } + UTeleportAgent* TeleportAgent = Agent->FindComponentByClass(); + bool bIsInsideAny = false; // a bool used to keep track wether a agent is not in any of the portal box colliders, prevents overwriting variables for multiple portals + + for (APortalV3* Portal: PortalList) + { + if (Portal->LinkedPortal == nullptr) + { + // if the portal has no linked portal skip to the next portal + continue; + } + + // series of checks to check the state of the teleport agent, for more info, check the function descriptions by hovering, or by peek definition. + if (Portal->IsInside(Agent->GetActorLocation())) + { + if (!TeleportAgent->bDoNotTeleport) + { + TeleportAgent->ChangeAgentCollision(false); + } + + // Check if the actor stays in front of the portal when inside the portal collider. if a change is detected, teleport. + if (CheckActorInFront(Portal->GetActorTransform(), Agent->GetActorTransform())) + { + TeleportAgent->SetTeleportStatus(Portal, true); + TeleportAgent->SetClipPlane(Portal->GetActorLocation(), Portal->GetActorTransform().GetRotation().GetForwardVector()); + bIsInsideAny = true; + } + else if (TeleportAgent->GetTeleportStatus(Portal)) + { + TeleportAgent->SetTeleportStatus(Portal, false); + TeleportActor(Agent, Portal); + TeleportAgent->SetTeleportStatus(Portal->LinkedPortal, true); + TeleportAgent->SetClipPlane(Portal->LinkedPortal->GetActorLocation(), Portal->LinkedPortal->GetActorTransform().GetRotation().GetForwardVector()); + bIsInsideAny = true; + } + } + else + { + TeleportAgent->SetTeleportStatus(Portal, false); + } + if (!bIsInsideAny) + { + TeleportAgent->DisableClipPlane(); + TeleportAgent->ResetAgentCollision(); + } + } + } +} + +/** + * Deprecated! No longer used in the final version of the code + */ +void APortal3Manager::UpdateDebugDisplay(ADebugDisplay* DebugDisplayActorIn) +{ + DebugDisplayActorIn->bTick = true; +} + +/** + * Resets the control and actor rotations of the player character smoothly using spherical linear interpolation (SLERP). + * This function corrects the player's orientation after passing through portals that may have altered their control rotation. + * The function uses Quaternions, as they are less prone to interlocking rotations and such. + * + * @param DeltaTime The time elapsed since the last frame. + */ +void APortal3Manager::ResetRotationControllerSlerp(float DeltaTime) +{ + FQuat PlayerControlQuat = PlayerController->GetControlRotation().Quaternion(); + FQuat PlayerActorQuat = PlayerController->GetCharacter()->GetActorRotation().Quaternion(); + + FRotator PlayerControlRot = PlayerController->GetControlRotation(); + FRotator PlayerActorRot = PlayerController->GetCharacter()->GetActorRotation(); + + float AdjustmentSpeed1, AdjustmentSpeed2; + + AdjustmentSpeed1 = 4.0f; + AdjustmentSpeed2 = 2.0f; + + FRotator TargetControlRot = PlayerControlRot; + FRotator TargetActorRot = PlayerActorRot; + + TargetControlRot.Roll = 0.0f; + + TargetActorRot.Roll = 0.0f; + TargetActorRot.Pitch = 0.0f; + + FQuat TargetControlQuat = FQuat(TargetControlRot); + FQuat TargetActorQuat = FQuat(TargetActorRot); + + FQuat NewControlQuat = FQuat::Slerp(PlayerControlQuat, TargetControlQuat, AdjustmentSpeed1 * DeltaTime); + FQuat NewActorQuat = FQuat::Slerp(PlayerActorQuat, TargetActorQuat, AdjustmentSpeed2 * DeltaTime); + + PlayerController->SetControlRotation(NewControlQuat.Rotator()); + PlayerController->GetCharacter()->SetActorRotation(NewActorQuat.Rotator()); + + const float Tolerance = 0.1; // or a small threshold value + if (NewControlQuat.Equals(TargetControlQuat, Tolerance) && NewActorQuat.Equals(TargetActorQuat, Tolerance)) + { + PlayerController->GetCharacter()->bUseControllerRotationYaw = true; + PlayerController->GetCharacter()->bUseControllerRotationRoll = true; + } +} + +/** + * Iterates through all teleport agents and checks their teleport status for each portal. + * Clones or updates actors based on teleport status. Removes cloned actors if teleport + * status is false for a portal. + * Could possibly have been combined with Teleport Actors Check function! + */ +void APortal3Manager::CloneOrUpdateAllActors() +{ + bCloneState = true; + for (TPair& Pair : TeleportAgents) + { + AActor* Agent = Pair.Value; // sometimes creates a nullptr error + if (Agent == nullptr) + { + UE_LOG(LogTemp, Warning, TEXT("TeleportAgents Length: %d"), TeleportAgents.Num()) + continue; + } + UTeleportAgent* TeleportAgent = Agent->FindComponentByClass(); + + for (APortalV3* Portal : PortalList) + { + if (Portal->LinkedPortal == nullptr) + { + continue; + } + if (TeleportAgent->GetTeleportStatus(Portal)) + { + UE_LOG(LogTemp, Warning, TEXT("01 Clone or Update Actor")); + CloneOrUpdateActor(Agent, Portal); + } + else + { + RemoveClonedActor(Agent, Portal); + } + } + } + bCloneState = false; +} + +/** + * Updates the viewport size and applies it to all portals or a single one. + * + * @param APortalV3 Reference, if provided, the function will only update the specific portal reference. + * @return True if the viewport size was successfully retrieved, false if default size was used. + */ +bool APortal3Manager::UpdateViewportSize(APortalV3* Portal) +{ + bool bIsViewportSucces = true; + FVector2D ViewportSize; + UGameViewportClient* ViewportClient = GetWorld()->GetGameViewport(); + ViewportClient->GetViewportSize(ViewportSize); + + MapAllActorsWithComponent(GetWorld(), TeleportAgents); + PortalList = FindAllActorsInWorld(GetWorld(), ABP_PortalV2); + + if (ViewportSize.X == 0 || ViewportSize.Y == 0) + { + ViewportSize = FVector2D(256, 256); + bIsViewportSucces = false; + } + + if (Portal == nullptr) + { + for (APortalV3* Portal_i : PortalList) + { + Portal_i->UpdateTextureTarget(ViewportSize); + } + } + else + { + Portal->UpdateTextureTarget(ViewportSize); + } + return bIsViewportSucces; +} + +/** + * Clones or updates the specified agent in the context of the given portal. + * + * This function checks if the agent already has a cloned counterpart associated with the portal. + * If no cloned actor is found, it creates a new clone of the agent. + * If a cloned actor exists, it updates the cloned actor's state to match the agent. + * Finally, it sets the clip plane on the cloned actor's teleport agent component based on the linked portal's location and forward vector. + * + * @param Agent The actor to be cloned or updated. + * @param Portal The portal that influences the cloning or updating process. + */ +void APortal3Manager::CloneOrUpdateActor(AActor* Agent, APortalV3* Portal) +{ + if (!Agent || !Portal || !Portal->LinkedPortal) + { + return; + } + + UE_LOG(LogTemp, Warning, TEXT("02 Find Actor pointer in ClonedActors Map")); + + AActor* ClonedActor = FindClonedActor(Agent, Portal); + + if (ClonedActor == nullptr) + { + UE_LOG(LogTemp, Warning, TEXT("03 Cloning Actor")); + CloneActor(Agent, Portal); + } + else + { + UE_LOG(LogTemp, Warning, TEXT("06 Updating Actor")); + UpdateClonedActor(Agent, ClonedActor, Portal); + } + ClonedActor = FindClonedActor(Agent, Portal); + UTeleportAgent* ClonedTeleportAgent = ClonedActor->FindComponentByClass(); + ClonedTeleportAgent->SetClipPlane(Portal->LinkedPortal->GetActorLocation(), Portal->LinkedPortal->GetActorTransform().GetRotation().GetForwardVector()); +} + +/** + * Clones the specified actor through the given portal. + * Depending on the type of actor (player character, projectile, or static mesh), + * it handles cloning and transformation appropriately. + * + * @param Agent The actor to be cloned. + * @param Portal The portal through which the actor will be cloned. + */ +void APortal3Manager::CloneActor(AActor* Agent, APortalV3* Portal) +{ + FTransform TargetTransform = Portal->LinkedPortal->GetActorTransform(); + FTransform PortalTransform = Portal->GetActorTransform(); + FTransform ActorTransform = Agent->GetActorTransform(); + + UTeleportAgent* TeleportAgent = Agent->FindComponentByClass(); + + FVector NewLocation = ConvertLocationToActorSpace(ActorTransform, PortalTransform, TargetTransform); + FQuat NewRotation = ConvertRotationToActorSpace(ActorTransform, PortalTransform, TargetTransform); + FTransform NewTransform(NewRotation, NewLocation, ActorTransform.GetScale3D()); + + TArray AttachedActors; + Agent->GetAttachedActors(AttachedActors); + + FActorSpawnParameters SpawnParams; + SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + + UE_LOG(LogTemp, Warning, TEXT("04 Cloning Actor")); + + if (TeleportAgent->bIsPlayerController) + { + FQuat NewRotationCam = ConvertRotationToActorSpace(PlayerController->PlayerCameraManager->GetTransform(), PortalTransform, TargetTransform); + + ACharacter* ClonedCharacter = GetWorld()->SpawnActor(Agent->GetClass(), NewLocation, NewRotation.Rotator(), SpawnParams); + APortal2Character* ClonedPortal2Character = Cast(ClonedCharacter); + APortal2Character* AgentPortal2Character = Cast(Agent); + + if (!ClonedCharacter) + { + UE_LOG(LogTemp, Error, TEXT("Cloning Actor Failed!")); + } + + UCameraComponent* CameraComponent = ClonedPortal2Character->GetFirstPersonCameraComponent(); + + USkeletalMeshComponent* ArmsComponent = ClonedPortal2Character->GetMesh1P(); + USkeletalMeshComponent* AgentArmsComponent = AgentPortal2Character->GetMesh1P(); + + if (CameraComponent && ArmsComponent) + { + UMyAnimInstance* AnimInstanceMain = Cast(AgentArmsComponent->GetAnimInstance()); + UMyAnimInstance* AnimInstance = Cast(ArmsComponent->GetAnimInstance()); + + AnimInstance->bOverrideBools = true; + AnimInstance->bUpdateBools = true; + AnimInstance->bIsMoving = AnimInstanceMain->bIsMoving; + AnimInstance->bIsInAir = AnimInstanceMain->bIsInAir; + AnimInstance->bHasRifle = AnimInstanceMain->bHasRifle; + AnimInstance->bTransitionDown = AnimInstanceMain->bTransitionDown; + AnimInstance->bTransitionUp = AnimInstanceMain->bTransitionUp; + AnimInstance->StartPosition = AnimInstanceMain->OutPosition; + + ClonedCharacter->GetCharacterMovement()->Velocity = ConvertVelocityToActorSpace(AgentPortal2Character->GetCharacterMovement()->Velocity, PortalTransform, TargetTransform); + + CameraComponent->SetWorldRotation(NewRotationCam); + } + + StoreClonedActor(Agent, Portal, ClonedCharacter); + + for (AActor* AttachedActor : AttachedActors) + { + AActor* ClonedAttachedActor = GetWorld()->SpawnActor(AttachedActor->GetClass(), NewLocation, NewRotation.Rotator(), SpawnParams); + UTP_WeaponComponent* WeaponComponent = ClonedAttachedActor->FindComponentByClass(); + if (WeaponComponent) + { + WeaponComponent->AttachWeapon(ClonedPortal2Character); + } + } + } + else if (Agent->IsA(APortal2Projectile::StaticClass())) + { + APortal2Projectile* ClonedProjectile = GetWorld()->SpawnActor(Agent->GetClass(), NewLocation, NewRotation.Rotator(), SpawnParams); + + ClonedProjectile->SetProjectileMovement(ConvertVelocityToActorSpace(Cast(Agent)->GetVelocity(), PortalTransform, TargetTransform)); + + ClonedProjectile->SetActorEnableCollision(ECollisionEnabled::NoCollision); + + StoreClonedActor(Agent, Portal, ClonedProjectile); + } + else if (Agent->IsA(AActor::StaticClass())) + { + AActor* ClonedStaticMesh = GetWorld()->SpawnActor(Agent->GetClass(), NewLocation, NewRotation.Rotator(), SpawnParams); + ClonedStaticMesh->SetActorTransform(NewTransform); + + UPrimitiveComponent* PrimitiveComponent = Cast(ClonedStaticMesh->GetRootComponent()); + if (PrimitiveComponent) + { + PrimitiveComponent->SetPhysicsLinearVelocity(ConvertVelocityToActorSpace(Cast(Agent)->GetVelocity(), PortalTransform, TargetTransform)); + } + StoreClonedActor(Agent, Portal, ClonedStaticMesh); + } + UE_LOG(LogTemp, Warning, TEXT("05 Cloned Actor")); +} + +/** + * Updates the cloned actor's position, rotation, and other properties based on the agent's state + * and the portal through which it was cloned. Depending on the type of actor (player character, projectile, or static mesh), + * it handles cloning and transformation appropriately. + * + * @param Agent The original actor whose clone is being updated. + * @param ClonedActor The cloned actor that needs to be updated. + * @param Portal The portal through which the actor was cloned. + */ +void APortal3Manager::UpdateClonedActor(AActor* Agent, AActor* ClonedActor, APortalV3* Portal) +{ + FTransform TargetTransform = Portal->LinkedPortal->GetActorTransform(); + FTransform PortalTransform = Portal->GetActorTransform(); + FTransform ActorTransform = Agent->GetActorTransform(); + + UTeleportAgent* TeleportAgent = Agent->FindComponentByClass(); + + FVector NewLocation = ConvertLocationToActorSpace(ActorTransform, PortalTransform, TargetTransform); + FQuat NewRotation = ConvertRotationToActorSpace(ActorTransform, PortalTransform, TargetTransform); + FTransform NewTransform(NewRotation, NewLocation, ActorTransform.GetScale3D()); + + UE_LOG(LogTemp, Warning, TEXT("07 Updating Actor")); + + //ClonedActor->SetActorLocationAndRotation(NewLocation, NewRotation); + ClonedActor->SetActorTransform(NewTransform); + + if (TeleportAgent->bIsPlayerController) + { + APortal2Character* PlayerCharacter = Cast(Agent); + APortal2Character* ClonedPortal2Character = Cast(ClonedActor); + + FQuat NewRotationCam = ConvertRotationToActorSpace(PlayerController->PlayerCameraManager->GetTransform(), PortalTransform, TargetTransform); + + UCameraComponent* CameraComponent = ClonedPortal2Character->GetFirstPersonCameraComponent(); + + USkeletalMeshComponent* ArmsComponent = ClonedPortal2Character->GetMesh1P(); + USkeletalMeshComponent* AgentArmsComponent = PlayerCharacter->GetMesh1P(); + + if (CameraComponent && ArmsComponent) + { + UMyAnimInstance* AnimInstanceMain = Cast(AgentArmsComponent->GetAnimInstance()); + UMyAnimInstance* AnimInstance = Cast(ArmsComponent->GetAnimInstance()); + + AnimInstance->bOverrideBools = false; + AnimInstance->bIsMoving = AnimInstanceMain->bIsMoving; + AnimInstance->bIsInAir = AnimInstanceMain->bIsInAir; + AnimInstance->bHasRifle = AnimInstanceMain->bHasRifle; + + if (AnimInstanceMain->bFire == true) + { + TArray Weapons; + TArray Weapons2; + ClonedActor->GetAttachedActors(Weapons); + Agent->GetAttachedActors(Weapons2); + UTP_WeaponComponent* WeaponComp = Weapons[0]->FindComponentByClass(); + UTP_WeaponComponent* WeaponComp2 = Weapons2[0]->FindComponentByClass(); + WeaponComp->PlayFireAnimation(false); + WeaponComp2->PlayFireAnimation(false); + } + + ClonedPortal2Character->GetCharacterMovement()->Velocity = ConvertVelocityToActorSpace(PlayerCharacter->GetCharacterMovement()->Velocity, PortalTransform, TargetTransform); + + CameraComponent->SetWorldRotation(NewRotationCam); + } + } + else if (TeleportAgent->IsA(APortal2Projectile::StaticClass())) + { + APortal2Projectile* Projectile = Cast(Agent); + APortal2Projectile* ClonedProjectile = Cast(ClonedActor); + ClonedProjectile->SetProjectileMovement(ConvertVelocityToActorSpace(Projectile->GetVelocity(), PortalTransform, TargetTransform)); + } + else if (TeleportAgent->IsA(AActor::StaticClass())) + { + UPrimitiveComponent* PrimitiveComponent = Cast(ClonedActor->GetRootComponent()); + if (PrimitiveComponent) + { + PrimitiveComponent->SetPhysicsLinearVelocity(ConvertVelocityToActorSpace(Agent->GetVelocity(), PortalTransform, TargetTransform)); + } + } +} + +/** + * Creates a new portal in the world at the specified location and rotation. + * Adds a portal reference to a UPortalSurface component for later referencing. + * If it's the orange portal, links it with the blue portal, + * and updates visuals. If it's the blue portal, does the reverse. + * + * @param PortalCenter The center position of the portal. + * @param PortalRotation The rotation of the portal. + * @param bIsOrangePortal Indicates if the portal being created is the orange portal. + * @param PortalSurfaceData The surface data associated with the portal. + * @param Index The index of the portal in the list. + */ +void APortal3Manager::CreateNewPortal(FVector PortalCenter, FQuat PortalRotation, bool bIsOrangePortal, UPortalSurface* PortalSurfaceData, int32 Index) +{ + UE_LOG(LogTemp, Warning, TEXT("Creating Portal at: "), *PortalCenter.ToString()); + + FQuat RotationCorrection = FQuat::MakeFromEuler(FVector(90.f, -90.f, 0.f)); + PortalRotation *= RotationCorrection; + APortalV3* NewPortal = Cast(GetWorld()->SpawnActor(ABP_PortalV2, PortalCenter, PortalRotation.Rotator())); + + if (NewPortal == nullptr) + { + return; + } + + if (bIsOrangePortal) + { + OrangePortal = NewPortal; + OrangePortal->SetSurfaceData(Index, PortalSurfaceData); + OrangePortal->SetPortalColor(FVector(50, 10, 0)); + + if (OrangePortal != nullptr && BluePortal != nullptr) + { + OrangePortal->LinkedPortal = BluePortal; + BluePortal->LinkedPortal = OrangePortal; + if (BluePortal->PortalSurface) + { + UE_LOG(LogTemp, Warning, TEXT("No Surface Attached to Blue?!?")); + } + if (OrangePortal->PortalSurface) + { + UE_LOG(LogTemp, Warning, TEXT("No Surface Attached to Orange?!?")); + } + BluePortal->PortalSurface->RebuildCollisionMesh(); + OrangePortal->PortalSurface->RebuildCollisionMesh(); + } + } + else + { + BluePortal = NewPortal; + BluePortal->SetSurfaceData(Index, PortalSurfaceData); + BluePortal->SetPortalColor(FVector(0, 10, 50)); + + if (OrangePortal != nullptr && BluePortal != nullptr) + { + BluePortal->LinkedPortal = OrangePortal; + OrangePortal->LinkedPortal = BluePortal; + if (BluePortal->PortalSurface) + { + UE_LOG(LogTemp, Warning, TEXT("No Surface Attached to Blue?!?")); + } + if (OrangePortal->PortalSurface) + { + UE_LOG(LogTemp, Warning, TEXT("No Surface Attached to Orange?!?")); + } + BluePortal->PortalSurface->RebuildCollisionMesh(); + OrangePortal->PortalSurface->RebuildCollisionMesh(); + UE_LOG(LogTemp, Warning, TEXT("Staying Alive - Staying Alive")) + } + } + + NewPortal->bIsOrangePortal = bIsOrangePortal; + + PortalList = FindAllActorsInWorld(GetWorld(), ABP_PortalV2); + + UpdateViewportSize(NewPortal); +} + +/** + * Destroys the existing orange or blue portal based on the specified flag. + * Updates the PortalList array after destruction. + * + * @param bIsOrangePortal True if destroying the orange portal, false for the blue portal. + */ +void APortal3Manager::DestroyOldPortal(bool bIsOrangePortal) +{ + if (bIsOrangePortal) + { + if (OrangePortal != nullptr) + { + OrangePortal->PortalDestroySelf(); + OrangePortal = nullptr; + } + } + else + { + if (BluePortal != nullptr) + { + BluePortal->PortalDestroySelf(); + BluePortal = nullptr; + } + } + PortalList = FindAllActorsInWorld(GetWorld(), ABP_PortalV2); +} + +/** + * Checks if the portal needs an update based on the current camera and portal transforms. + * + * This function compares the provided current transforms of the portal to check wether or not the portal texture should be rendered this frame. + * + * @param Portal The portal actor being checked. + * @param PortalTransform The current transform of the portal. + * @param CameraTransform The current transform of the camera. + * @return true if the portal needs an update, false otherwise. + */ +bool APortal3Manager::CheckPortalNeedsUpdate(APortalV3* Portal, FTransform Reference, FTransform Camera) +{ + if (PlayerPortalDistance(Reference, Camera)) + { + return true; + } + + FQuat RotationQuat = FQuat(FRotator(0.f, 45.f, 0.f)); + FQuat RotationQuatInverse = FQuat(FRotator(0.f, -45.f, 0.f)); + + if (CheckActorInFront(Reference, Camera) && CheckActorInFront(FTransform(Camera.GetRotation() * RotationQuat, Camera.GetLocation(), Camera.GetScale3D()), Reference) && CheckActorInFront(FTransform(Camera.GetRotation() * RotationQuatInverse, Camera.GetLocation(), Camera.GetScale3D()), Reference)) + { + TArray PortalBounds = Portal->GetPortalBounds(); + if (CheckPlayerPortalLineOfSigth(PortalBounds, Camera, Portal)) + { + return true; + } + } + return false; +} + +/** + * Checks if the player is within a specified distance threshold from a reference point. + * Prevents problems with updating the portal textures when the player moves through. + * + * @param Reference The transform representing the reference point. + * @param Camera The transform representing the player's camera position. + * @return True if the player is within 100 units of the reference point, false otherwise. + */ +bool APortal3Manager::PlayerPortalDistance(FTransform Reference, FTransform Camera) +{ + float Distance = FVector::Distance(Camera.GetLocation(), Reference.GetLocation()); + if (Distance <= 100) + { + return true; + } + return false; +} + +/** + * Checks if the camera or actor transform is in front of a reference plane defined by a transform. + * + * @param Reference The transform representing the reference point and orientation of the plane. + * @param Camera The transform representing the camera or actor position to check. + * @return True if the camera or actor position is in front of the reference plane, false otherwise. + */ +bool APortal3Manager::CheckActorInFront(FTransform Reference, FTransform Camera) +{ + FPlane PortalPlane = FPlane(Reference.GetLocation(), Reference.GetRotation().GetForwardVector()); + float PortalDot = PortalPlane.PlaneDot(Camera.GetLocation()); + + if (PortalDot < 0) + { + return false; + } + return true; +} + +/** + * Checks if the player's camera has a clear line of sight to any corner of a portal, using raycasting. + * + * @param PortalBounds Array of corner points defining the bounding volume of the portal in world space. + * @param Camera Transform representing the player's camera position and orientation. + * @param Portal Pointer to the portal actor to exclude from the raycast checks (to avoid self-intersection). + * @return True if there is a clear line of sight from the camera to any portal corner, false otherwise. + */ +bool APortal3Manager::CheckPlayerPortalLineOfSigth(TArray PortalBounds, FTransform Camera, AActor* Portal) +{ + for (const FVector& Corner : PortalBounds) + { + //DrawDebugSphere(GetWorld(), Corner, 20, 12, FColor::Green, false, -1.0f, 0, 1); + if (RaycastClear(Camera.GetLocation(), Corner, Portal)) + { + return true; + } + } + return false; +} + +/** + * Performs a line trace to check if there are any obstructions between two points (Start and End). + * + * @param Start The starting point of the raycast. + * @param End The end point of the raycast. + * @param Portal Pointer to the portal actor to exclude from the raycast check (to avoid self-intersection). + * @return True if there are no obstructions between Start and End, or if the only obstruction is the Portal itself. False otherwise. + */ +bool APortal3Manager::RaycastClear(const FVector& Start, const FVector& End, AActor* Portal) +{ + FHitResult HitResult; + FCollisionQueryParams CollisionParams; + + bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, CollisionParams); + + return !bHit || HitResult.GetActor() == Portal; +} + +/** +* Public function to assign a bIsCloned status to TeleportAgents. This status is based on what moment during +* the tick function this function is called. It is a rusty solution to spawning blueprints with variables attached. +* +* @return True is the actor was cloned instead of original. +*/ +bool APortal3Manager::GetCloneStatus() +{ + return bCloneState; +} + +/** + * Converts a location from one actor's space (Camera) to another actor's space (Target) based on a reference actor (Reference). + * In the portal project, this is used to both teleport actors and update screencapture camera positions. + * + * @param Camera The transform of the camera or source actor from which the location is being converted. + * @param Reference The transform of the reference actor to which the Camera's location is relative. + * @param Target The transform of the target actor to which the converted location is relative. + * @return The location vector converted to the space of the Target actor. + */ +FVector APortal3Manager::ConvertLocationToActorSpace(FTransform Camera, FTransform Reference, FTransform Target) +{ + FVector Direction = Camera.GetLocation() - Reference.GetLocation(); + + FVector Dots; + Dots.X = FVector::DotProduct(Direction, Reference.GetRotation().GetForwardVector()); + Dots.Y = FVector::DotProduct(Direction, Reference.GetRotation().GetRightVector()); + Dots.Z = FVector::DotProduct(Direction, Reference.GetRotation().GetUpVector()); + + FVector NewDirection = Dots.X * -Target.GetRotation().GetForwardVector() + Dots.Y * -Target.GetRotation().GetRightVector() + Dots.Z * Target.GetRotation().GetUpVector(); + + return Target.GetLocation() + NewDirection; +} + +/** + * Converts a rotation from one actor's space (Camera) to another actor's space (Target) based on a reference actor (Reference). + * In the portal project, this is used to both rotate teleported actors and update screencapture camera rotations. + * + * @param Camera The transform of the camera or source actor from which the rotation is being converted. + * @param Reference The transform of the reference actor to which the Camera's rotation is relative. + * @param Target The transform of the target actor to which the converted rotation is relative. + * @return The rotation quaternion converted to the space of the Target actor. + */ +FQuat APortal3Manager::ConvertRotationToActorSpace(FTransform Camera, FTransform Reference, FTransform Target) +{ + FQuat LocalQuat = Reference.GetRotation().Inverse() * Camera.GetRotation(); + LocalQuat = FQuat(FVector::UpVector, PI) * LocalQuat; + + return Target.GetRotation() * LocalQuat; +} + +/** + * Converts a velocity vector from one actor's space (Reference) to another actor's space (Target). + * In the portal project, this is used to update the velocity vector of teleported actors. + * + * @param Object The velocity vector of the object in the Reference actor's space. + * @param Reference The transform of the reference actor whose space the velocity is relative to. + * @param Target The transform of the target actor to which the converted velocity should be relative. + * @return The velocity vector converted to the space of the Target actor. + */ +FVector APortal3Manager::ConvertVelocityToActorSpace(FVector Object, FTransform Reference, FTransform Target) +{ + FVector Direction = Object; + + FVector Dots; + Dots.X = FVector::DotProduct(Direction, Reference.GetRotation().GetForwardVector()); + Dots.Y = FVector::DotProduct(Direction, Reference.GetRotation().GetRightVector()); + Dots.Z = FVector::DotProduct(Direction, Reference.GetRotation().GetUpVector()); + + FVector NewVelocity = Dots.X * -Target.GetRotation().GetForwardVector() + Dots.Y * -Target.GetRotation().GetRightVector() + Dots.Z * Target.GetRotation().GetUpVector(); + + return NewVelocity; +} + +/** + * Retrieves the camera projection matrix based on the current view or projection settings. + * + * @param CameraManagerIn The player camera manager instance that manages the camera settings. + * @param bIsView Flag indicating whether to retrieve the view matrix (true) or projection matrix (false). + * @return The requested matrix (ViewProjectionMatrix if bIsView is true, ProjectionMatrix if false). + */ +FMatrix APortal3Manager::GetCameraProjectionMatrix(APlayerCameraManager* CameraManagerIn, bool bIsView) +{ + FMinimalViewInfo CameraView = CameraManagerIn->GetCameraCacheView(); + + FMatrix ViewMatrix; + FMatrix ProjectionMatrix; + FMatrix ViewProjectionMatrix; + + UGameplayStatics::GetViewProjectionMatrix(CameraView, ViewMatrix, ProjectionMatrix, ViewProjectionMatrix); + if (bIsView) + { + return ViewProjectionMatrix; + } + else + { + return ProjectionMatrix; + } +} + +/** + * Teleports the specified actor through the given portal. + * + * @param Agent The actor to teleport. + * @param Portal The portal through which the actor will be teleported. + */ +void APortal3Manager::TeleportActor(AActor* Agent, APortalV3* Portal) +{ + UTeleportAgent* TeleportAgent = Agent->FindComponentByClass(); + + FTransform PortalTransform = Portal->GetActorTransform(); + FTransform TargetTransform = Portal->LinkedPortal->GetActorTransform(); + FTransform ActorTransform = Agent->GetActorTransform(); + + FVector NewLocation = ConvertLocationToActorSpace(ActorTransform, PortalTransform, TargetTransform); + FQuat NewRotation = ConvertRotationToActorSpace(ActorTransform, PortalTransform, TargetTransform); + FVector NewVelocity = ConvertVelocityToActorSpace(Agent->GetVelocity() ,PortalTransform, TargetTransform); + + USceneComponent* RootComponent2 = Agent->GetRootComponent(); + UPrimitiveComponent* PrimitiveRootComponent = Cast(RootComponent2); + PrimitiveRootComponent->SetPhysicsLinearVelocity(NewVelocity); + + FHitResult HitResult; + + if (TeleportAgent->bIsPlayerController) + { + Agent->SetActorLocation(NewLocation, false, &HitResult, ETeleportType::TeleportPhysics); + + // causes issues with horizontal to vertical portal rotations, but fixes stutter in same plane portals (ONLY FOR CHARACTER)?!? + Agent->SetActorRotation(FRotator(NewRotation.Rotator().Pitch, NewRotation.Rotator().Yaw, NewRotation.Rotator().Roll)); + ACharacter* Char = Cast(Agent); + Char->bUseControllerRotationYaw = false; + Char->bUseControllerRotationRoll = false; + + + FRotator NewRotation2 = PlayerController->GetControlRotation(); + FQuat LocalQuat = PortalTransform.GetRotation().Inverse() * NewRotation2.Quaternion(); + LocalQuat = FQuat(FVector::UpVector, PI) * LocalQuat; + LocalQuat = TargetTransform.GetRotation() * LocalQuat; + + + PlayerController->SetControlRotation(FRotator(LocalQuat.Rotator().Pitch, LocalQuat.Rotator().Yaw, LocalQuat.Rotator().Roll)); + PlayerController->GetCharacter()->GetCharacterMovement()->Velocity = NewVelocity; + + //Agent->SetActorRotation(FRotator(NewRotation.Rotator().Pitch, NewRotation.Rotator().Yaw, NewRotation.Rotator().Roll)); + } + else if (Agent->IsA(APortal2Projectile::StaticClass())) + { + Agent->SetActorLocation(NewLocation, false, &HitResult, ETeleportType::TeleportPhysics); + Agent->SetActorRotation(NewRotation); + APortal2Projectile* Projectile = Cast(Agent); + Projectile->SetProjectileMovement(NewVelocity); + } + else + { + Agent->SetActorLocation(NewLocation, false, &HitResult, ETeleportType::TeleportPhysics); + Agent->SetActorRotation(NewRotation); + } +} + +/** + * Maps all actors in the world that have a UTeleportAgent component, excluding those with bDoNotTeleport set to true. + * + * @param World The world context to search for actors. + * @param OutActors The output map where mapped actors will be stored (Key: Actor with UTeleportAgent component, Value: Actor itself). + */ +void APortal3Manager::MapAllActorsWithComponent(UWorld* World, TMap& OutActors) +{ + if (!World) + { + return; + } + + for (TActorIterator It(World); It; ++It) + { + AActor* Actor = *It; + if (Actor->FindComponentByClass()) + { + if (!Actor->FindComponentByClass()->bDoNotTeleport) + { + OutActors.FindOrAdd(Actor, Actor); + } + } + } +} + +/** + * Finds the cloned actor corresponding to the given Agent and Portal. + * + * @param Agent The original actor that was cloned. + * @param Portal The portal through which the actor was cloned. + * @return The cloned actor corresponding to Agent and Portal, or nullptr if not found. + */ +AActor* APortal3Manager::FindClonedActor(AActor* Agent, APortalV3* Portal) +{ + FAgentPortalKey Key(Agent, Portal); + AActor** ClonedActorPtr = ClonedActors.Find(Key); + return ClonedActorPtr ? *ClonedActorPtr : nullptr; +} + +/** + * Stores the cloned actor corresponding to the given Agent and Portal in the ClonedActors map. + * + * @param Agent The original actor that was cloned. + * @param Portal The portal through which the actor was cloned. + * @param ClonedActor The cloned actor to store. + */ +void APortal3Manager::StoreClonedActor(AActor* Agent, APortalV3* Portal, AActor* ClonedActor) +{ + FAgentPortalKey Key(Agent, Portal); + ClonedActors.Add(Key, ClonedActor); +} + +/** + * Removes the cloned actor associated with the given Agent and Portal from the ClonedActors map and destroys it. + * + * @param Agent The original actor whose clone needs to be removed. + * @param Portal The portal associated with the cloned actor to be removed. + */ +void APortal3Manager::RemoveClonedActor(AActor* Agent, APortalV3* Portal) +{ + FAgentPortalKey Key(Agent, Portal); + AActor* ClonedActor = FindClonedActor(Agent, Portal); + if (ClonedActor != nullptr) + { + UE_LOG(LogTemp, Warning, TEXT("08 Removing Cloned Actor")); + TArray AttachedActors; + ClonedActor->GetAttachedActors(AttachedActors); + + for (AActor* AttachedActor : AttachedActors) + { + AttachedActor->Destroy(); + } + + ClonedActors.Remove(Key); + ClonedActor->Destroy(); + } +} + +/** + * Function that can be called to add a actor with the UTeleportAgent component to the teleportable actors map. + */ +void APortal3Manager::HandleActorSpawned(AActor* Actor) +{ + if (Actor->FindComponentByClass()) + { + TeleportAgents.FindOrAdd(Actor, Actor); + } +} + +/** + * Function that can be called to remove a actor with the UTeleportAgent component to the teleportable actors map. + */ +void APortal3Manager::HandleActorDestroyed(AActor* Actor) +{ + if (Actor->FindComponentByClass()) + { + UE_LOG(LogTemp, Warning, TEXT("Removed Actor")); + TeleportAgents.Remove(Actor); + } +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalBullet.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalBullet.cpp new file mode 100644 index 0000000..afef27d --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalBullet.cpp @@ -0,0 +1,310 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "PortalBullet.h" + +#include "GameFramework/ProjectileMovementComponent.h" +#include "Components/SphereComponent.h" +#include "Kismet/KismetMathLibrary.h" + +// Sets default values +APortalBullet::APortalBullet() +{ + // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. + PrimaryActorTick.bCanEverTick = true; + + SphereCollision = CreateDefaultSubobject(TEXT("SphereCollision")); + SphereCollision->InitSphereRadius(15.0f); // Set the radius as desired + + SphereCollision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); + SphereCollision->SetCollisionObjectType(ECC_WorldDynamic); + SphereCollision->SetCollisionResponseToAllChannels(ECR_Block); + SphereCollision->SetCollisionResponseToChannel(ECC_Pawn, ECR_Ignore); + + SphereCollision->OnComponentBeginOverlap.AddDynamic(this, &APortalBullet::OnOverlapBegin); + SphereCollision->OnComponentHit.AddDynamic(this, &APortalBullet::OnHit); + + SphereCollision->SetWalkableSlopeOverride(FWalkableSlopeOverride(WalkableSlope_Unwalkable, 0.f)); + SphereCollision->CanCharacterStepUpOn = ECB_No; + + RootComponent = SphereCollision; + + ProjectileMovement = CreateDefaultSubobject(TEXT("ProjectileMovement")); + ProjectileMovement->UpdatedComponent = SphereCollision; + ProjectileMovement->InitialSpeed = 2000.f; + ProjectileMovement->MaxSpeed = 2000.f; + ProjectileMovement->bRotationFollowsVelocity = true; + ProjectileMovement->bShouldBounce = false; + + NiagaraComponent = CreateDefaultSubobject(TEXT("NiagaraComponent")); + NiagaraComponent->SetupAttachment(SphereCollision); + + InitialLifeSpan = 5.0f; +} + +/** + * Called when the projectile hits something + * + * @param HitComp The component that was hit + * @param OtherActor The other actor involved in the collision + * @param OtherComp The other component involved in the collision + * @param NormalImpulse The force of the impact + * @param Hit Detailed information about the hit + */ +void APortalBullet::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) +{ + if (OtherActor && OtherActor != this && OtherComp) + { + // Check if the hit component is of PortalSurface channel + if (OtherComp->GetCollisionObjectType() == ECC_GameTraceChannel2) // Ensure this is set to PortalSurface channel + { + TArray ManagerArray; + if (BP_Portal3Manager != nullptr) + { + UGameplayStatics::GetAllActorsOfClass(GetWorld(), BP_Portal3Manager, ManagerArray); + APortal3Manager* PortalManager = Cast(ManagerArray[0]); + PortalManager->DestroyOldPortal(bIsOrangePortal); + } + + UE_LOG(LogTemp, Warning, TEXT("================= Portal surface hit! =================")); + UStaticMeshComponent* Plane = OtherActor->GetComponentByClass(); + UPortalSurface* PortalSurfaceData = OtherActor->GetComponentByClass(); + + if (PortalSurfaceData) + { + UE_LOG(LogTemp, Warning, TEXT("No Portal Surface?!?")); + } + + FVector SurfaceOrigin, SurfaceExtend; + Plane->GetLocalBounds(SurfaceOrigin, SurfaceExtend); + + SurfaceOrigin = Plane->GetOwner()->GetActorLocation() + Plane->GetOwner()->GetActorRotation().RotateVector(Plane->GetRelativeLocation() * Plane->GetRelativeScale3D()); + SurfaceExtend *= Plane->GetRelativeScale3D();//GetOwner()->GetActorScale3D(); + + DrawDebugBox(GetWorld(), FVector(0, 0, 1400), SurfaceExtend, FRotator(0, 0, 0).Quaternion(), FColor::Green, false, 5.0f, 0, 2.0f); + DrawDebugSphere(GetWorld(), Hit.ImpactPoint, 10.0f, 12, FColor::Red, false, 5.0f); + + FVector LocalHitLocation = Plane->GetComponentTransform().InverseTransformPosition(Hit.ImpactPoint); + //LocalHitLocation.Z += 1400; + LocalHitLocation *= Plane->GetRelativeScale3D(); + + DrawDebugSphere(GetWorld(), LocalHitLocation, 10.0f, 12, FColor::Red, false, 5.0f); + + FVector PortalSize(120.f, 240.f, 0.f); + + FVector LocalPortalMin = LocalHitLocation - (PortalSize / 2.0f); + FVector LocalPortalMax = LocalHitLocation + (PortalSize / 2.0f); + + FVector PortalCenter = Hit.ImpactPoint; + FVector PortalExtend = PortalSize / 2.0f; + FQuat BoxRotation = OtherActor->GetActorRotation().Quaternion(); // Assuming the portal aligns with the plane's rotation + + APlayerController* PlayerController = GetWorld()->GetFirstPlayerController(); + if (PlayerController) + { + APawn* PlayerPawn = PlayerController->GetPawn(); + if (PlayerPawn) + { + FVector SurfaceForward = Plane->GetOwner()->GetActorForwardVector(); + FVector SurfaceRight = Plane->GetOwner()->GetActorRightVector(); + FVector SurfaceUp = Plane->GetOwner()->GetActorUpVector(); + FVector PlayerRight = PlayerPawn->GetActorRightVector(); + + // Calculate the roll angle + float DotForward = FVector::DotProduct(SurfaceForward, PlayerRight); + float DotRight = FVector::DotProduct(SurfaceRight, PlayerRight); + + FVector PortalUpVector = FVector(SurfaceForward * DotForward + SurfaceRight * DotRight).GetSafeNormal(); + FVector PortalForwardVector = SurfaceUp.GetSafeNormal(); + FVector PortalRightVector = FVector::CrossProduct(PortalUpVector, PortalForwardVector).GetSafeNormal(); + + DrawDebugDirectionalArrow(GetWorld(), PortalCenter, PortalCenter + PortalUpVector * 100, 20.f, FColor::Blue, false, 5.0f, 0, 2.0f); + DrawDebugDirectionalArrow(GetWorld(), PortalCenter, PortalCenter + SurfaceRight * 100, 20.f, FColor::Orange, false, 5.0f, 0, 2.0f); + DrawDebugDirectionalArrow(GetWorld(), PortalCenter, PortalCenter + SurfaceForward * 100, 20.f, FColor::Orange, false, 5.0f, 0, 2.0f); + + FRotator BoxRotation2 = UKismetMathLibrary::MakeRotationFromAxes(PortalUpVector, PortalRightVector, -PortalForwardVector); + + FQuat BoxRotation3 = Plane->GetOwner()->GetActorRotation().Quaternion().Inverse() * BoxRotation2.Quaternion(); + + FVector BR_Point, BL_Point, TR_Point, TL_Point; + + BR_Point = FVector(PortalExtend.X, -PortalExtend.Y, 0); + BL_Point = FVector(-PortalExtend.X, -PortalExtend.Y, 0); + TR_Point = FVector(PortalExtend.X, PortalExtend.Y, 0); + TL_Point = FVector(-PortalExtend.X, PortalExtend.Y, 0); + + BR_Point = BoxRotation3.RotateVector(BR_Point) + LocalHitLocation; + BL_Point = BoxRotation3.RotateVector(BL_Point) + LocalHitLocation; + TR_Point = BoxRotation3.RotateVector(TR_Point) + LocalHitLocation; + TL_Point = BoxRotation3.RotateVector(TL_Point) + LocalHitLocation; + + DrawDebugSphere(GetWorld(), FVector(BR_Point.X, BR_Point.Y, 1400), 10.0f, 12, FColor::Black, false, 5.0f); + DrawDebugSphere(GetWorld(), FVector(BL_Point.X, BL_Point.Y, 1400), 10.0f, 12, FColor::Black, false, 5.0f); + DrawDebugSphere(GetWorld(), FVector(TR_Point.X, TR_Point.Y, 1400), 10.0f, 12, FColor::Black, false, 5.0f); + DrawDebugSphere(GetWorld(), FVector(TL_Point.X, TL_Point.Y, 1400), 10.0f, 12, FColor::Black, false, 5.0f); + + std::pair MinMaxVectors = FindMinMax(BR_Point, BL_Point, TR_Point, TL_Point); + + LocalPortalMin = MinMaxVectors.first; + LocalPortalMax = MinMaxVectors.second; + + FVector NewBoxExtend((LocalPortalMax.X - LocalPortalMin.X) / 2, (LocalPortalMax.Y - LocalPortalMin.Y) / 2, 0); + int32 Index; + FVector Displacement; + FRotator BoxRotation4 = BoxRotation3.Rotator(); + + if (!AdjustPortalPosition(PortalSurfaceData, LocalPortalMin, LocalPortalMax, LocalHitLocation, FVector(0, 0, 0), SurfaceExtend, Index, Displacement, BoxRotation4)) + { + PortalSurfaceData->RemovePortal(Index); + Destroy(); + return; + } + + Displacement = BoxRotation.RotateVector(Displacement); + PortalCenter += Displacement; + + bool bCanFit = (LocalPortalMin.X >= -SurfaceExtend.X && LocalPortalMax.X <= SurfaceExtend.X) && (LocalPortalMin.Y >= -SurfaceExtend.Y && LocalPortalMax.Y <= SurfaceExtend.Y); + + if (bCanFit) + { + SpawnPortalOnSurface(PortalCenter, BoxRotation2.Quaternion(), OtherActor->GetActorUpVector(), PortalSurfaceData, Index); + } + else + { + PortalSurfaceData->RemovePortal(Index); + UE_LOG(LogTemp, Warning, TEXT("Portal cannot be placed at this location.")); + } + } + } + } + Destroy(); + } +} + +/** + * Called when the projectile overlaps another object + * + * @param OverlappedComponent The component that was overlapped + * @param OtherActor The other actor involved in the overlap + * @param OtherComp The other component involved in the overlap + * @param OtherBodyIndex The index of the other body + * @param bFromSweep Whether the overlap was from a sweep + * @param SweepResult Detailed information about the sweep + */ +void APortalBullet::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + UE_LOG(LogTemp, Warning, TEXT("PORTAL HIT")); +} + +/** + * Finds the minimum and maximum vectors among the given points + * + * @param BR_Point Bottom-right point + * @param BL_Point Bottom-left point + * @param TR_Point Top-right point + * @param TL_Point Top-left point + * @return A pair containing the minimum and maximum vectors + */ +std::pair APortalBullet::FindMinMax(const FVector& BR_Point, const FVector& BL_Point, const FVector& TR_Point, const FVector& TL_Point) +{ + float MinX = BR_Point.X; + float MaxX = BR_Point.X; + float MinY = BR_Point.Y; + float MaxY = BR_Point.Y; + + FVector Points[] = { BL_Point, TR_Point, TL_Point }; + + for (const FVector& Point : Points) + { + if (Point.X < MinX) + { + MinX = Point.X; + } + if (Point.X > MaxX) + { + MaxX = Point.X; + } + if (Point.Y < MinY) + { + MinY = Point.Y; + } + if (Point.Y > MaxY) + { + MaxY = Point.Y; + } + } + + FVector MinVector(MinX, MinY, 0.0f); + FVector MaxVector(MaxX, MaxY, 0.0f); + + return std::make_pair(MinVector, MaxVector); +} + +/** + * Adjusts the portal's position on the surface + * + * @param PortalSurfaceData The portal surface data component + * @param LocalPortalMin The local minimum vector of the portal + * @param LocalPortalMax The local maximum vector of the portal + * @param PortalCenter The center point of the portal + * @param SurfaceOrigin The origin of the surface + * @param SurfaceExtend The extent of the surface + * @param Index The index of the portal + * @param Displacement The displacement vector + * @param Rotation The rotation of the portal + * @return true if the portal's position is adjusted, false otherwise + */ +bool APortalBullet::AdjustPortalPosition(UPortalSurface* PortalSurfaceData, FVector& LocalPortalMin, FVector& LocalPortalMax, FVector& PortalCenter, const FVector& SurfaceOrigin, const FVector& SurfaceExtend, int32& Index, FVector& Displacement, FRotator& Rotation) +{ + bool bCanPortalBePlaced = true; + + FVector BoxMin = SurfaceOrigin - SurfaceExtend; + FVector BoxMax = SurfaceOrigin + SurfaceExtend; + + Index = PortalSurfaceData->AddPortal(LocalPortalMin, LocalPortalMax, PortalCenter, Rotation); + + PortalSurfaceData->FitPortalToSurface(Index, BoxMin, BoxMax); + + if (!PortalSurfaceData->MovePortalOnOverlap(Index)) + { + UE_LOG(LogTemp, Warning, TEXT("Moved Portal")) + bCanPortalBePlaced = PortalSurfaceData->MovePortalOnOverlap(Index); + if (!bCanPortalBePlaced) + { + UE_LOG(LogTemp, Warning, TEXT("Cancel Placement")) + return bCanPortalBePlaced; + } + } + else + { + UE_LOG(LogTemp, Warning, TEXT("Not Moved")) + } + + FVector PortalCenterOld = PortalCenter; + PortalSurfaceData->GetPortal(Index, LocalPortalMin, LocalPortalMax, PortalCenter); + Displacement = PortalCenter - PortalCenterOld; + return bCanPortalBePlaced; +} + +/** + * Spawns the portal on the surface + * + * @param PortalCenter The center point of the portal + * @param PortalRotation The rotation of the portal + * @param SurfaceForwardVector The forward vector of the surface + * @param PortalSurfaceData The portal surface data component + * @param Index The index of the portal + */ +void APortalBullet::SpawnPortalOnSurface(FVector PortalCenter, FQuat PortalRotation, FVector SurfaceForwardVector, UPortalSurface* PortalSurfaceData, int32 Index) +{ + SurfaceForwardVector *= 0.1; // offset from the surface, from testing, it needs to be 1.2 units apart or it might cause incorrect collision bugs. + TArray ManagerArray; + if (BP_Portal3Manager != nullptr) + { + UGameplayStatics::GetAllActorsOfClass(GetWorld(), BP_Portal3Manager, ManagerArray); + APortal3Manager* PortalManager = Cast(ManagerArray[0]); + PortalManager->CreateNewPortal(PortalCenter + SurfaceForwardVector, PortalRotation, bIsOrangePortal, PortalSurfaceData, Index); + } +} + + + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalSurface.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalSurface.cpp new file mode 100644 index 0000000..88ba203 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalSurface.cpp @@ -0,0 +1,306 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "PortalSurface.h" +#include "Portal3Manager.h" +#include "DynamicMeshBuilder.h" +#include "Components/StaticMeshComponent.h" + +// Sets default values for this component's properties +UPortalSurface::UPortalSurface() : UniquePortalId(0) +{ + PrimaryComponentTick.bCanEverTick = false; + Mesh = nullptr; +} + +void UPortalSurface::BeginPlay() +{ + Super::BeginPlay(); + + AActor* Owner = GetOwner(); + if (Owner) + { + DynamicMeshComponent = Owner->FindComponentByClass(); + } +} + +/** + * Sets the scale of the inline surface mesh, without changing the actual scale of the actor. + * + * @param Scale The scale to set + */ +void UPortalSurface::SetInlineScale(FVector Scale) +{ + InlineScale = Scale; +} + +/** + * Gets the scale of the inline surface mesh. + * + * @return The scale of the inline mesh + */ +FVector UPortalSurface::GetInlineScale() const +{ + return InlineScale; +} + +/** + * Rebuilds the collision mesh + */ +void UPortalSurface::RebuildCollisionMesh() +{ + RebuildCollision.Broadcast(); +} + +/** + * Sets the visibility of the dynamic mesh. + * + * @param bVisible Whether the mesh should be visible + */ +void UPortalSurface::SetMeshVisibility(bool bVisible) +{ + if (DynamicMeshComponent) + { + DynamicMeshComponent->SetVisibility(bVisible, false); + DynamicMeshComponent->SetHiddenInGame(!bVisible, false); + } +} + +/** + * Adds a portal to the TMap. + * + * @param Min The minimum vector of the portal domain + * @param Max The maximum vector of the portal domain + * @param Center The center point of the portal + * @param Rotation The rotation of the portal + * @return The ID of the added portal + */ +int32 UPortalSurface::AddPortal(const FVector& Min, const FVector& Max, const FVector& Center, const FRotator& Rotation) +{ + int32 Index = ++UniquePortalId; + UE_LOG(LogTemp, Warning, TEXT("Adding Portal to SurfaceMap, Index: %d"), Index); + Portals.Add(Index, FPortalData(Min, Max, Center, Rotation)); + return Index; +} + +/** + * Gets a portal from the TMap. + * + * @param PortalID The ID of the portal to get + * @param Min The minimum vector of the portal domain (output) + * @param Max The maximum vector of the portal domain (output) + * @param Center The center point of the portal (output) + * @return true if the portal is found, false otherwise + */ +bool UPortalSurface::GetPortal(int32 PortalID, FVector& Min, FVector& Max, FVector& Center) const +{ + UE_LOG(LogTemp, Warning, TEXT("Getting Portal from SurfaceMap, Index: %d"), PortalID); + const FPortalData* PortalData = Portals.Find(PortalID); + if (PortalData) + { + Min = PortalData->Min; + Max = PortalData->Max; + Center = PortalData->Center; + + return true; + } + return false; +} + +/** + * Updates a portal in the TMap. + * + * @param PortalID The ID of the portal to update + * @param Min The new minimum vector of the portal domain + * @param Max The new maximum vector of the portal domain + * @param Center The new center point of the portal + * @return true if the portal is updated, false otherwise + */ +bool UPortalSurface::UpdatePortal(int32 PortalID, FVector Min, FVector Max, FVector Center) +{ + UE_LOG(LogTemp, Warning, TEXT("Updating Portal from SurfaceMap, Index: PortalID"), PortalID); + FPortalData* PortalData = Portals.Find(PortalID); + if (PortalData) + { + PortalData->Min = Min; + PortalData->Max = Max; + PortalData->Center = Center; + return true; + } + return false; +} + +/** + * Removes a portal from the TMap. + * + * @param PortalID The ID of the portal to remove + * @return true if the portal is removed, false otherwise + */ +bool UPortalSurface::RemovePortal(int32 PortalID) +{ + UE_LOG(LogTemp, Warning, TEXT("Removing Portal From SurfaceMap, Index: %d"), PortalID); + Portals.Remove(PortalID); + RebuildCollisionMesh(); + return true; +} + +/** + * Moves a portal if it overlaps with another portal. + * + * @param PortalID The ID of the portal to move + * @return true if the portal is moved, false otherwise + */ +bool UPortalSurface::MovePortalOnOverlap(int32 PortalID) +{ + bool bMoved = false; + + FVector Min, Max, Center; + GetPortal(PortalID, Min, Max, Center); + + for (const auto& Elem : Portals) + { + int32 OtherPortalID = Elem.Key; + + if (PortalID == OtherPortalID) + { + continue; + } + + const FPortalData* OtherPortal = Portals.Find(OtherPortalID); + + bool OverlappingX = (Max.X > OtherPortal->Min.X && Min.X < OtherPortal->Max.X); + bool OverlappingY = (Max.Y > OtherPortal->Min.Y && Min.Y < OtherPortal->Max.Y); + + if (OverlappingX && OverlappingY) + { + float MoveX = 0.0f; + float MoveY = 0.0f; + + DrawDebugSphere(GetWorld(), Min + FVector(0,0,1400), 10.0f, 12, FColor::Blue, false, 300.0f); + DrawDebugSphere(GetWorld(), Max + FVector(0, 0, 1400), 10.0f, 12, FColor::Cyan, false, 300.0f); + DrawDebugSphere(GetWorld(), OtherPortal->Min + FVector(0, 0, 1400), 10.0f, 12, FColor::Red, false, 300.0f); + DrawDebugSphere(GetWorld(), OtherPortal->Max + FVector(0, 0, 1400), 10.0f, 12, FColor::Orange, false, 300.0f); + + MoveX = (FMath::Abs(OtherPortal->Min.X - Max.X) < FMath::Abs(OtherPortal->Max.X - Min.X)) ? (OtherPortal->Min.X - Max.X) : (OtherPortal->Max.X - Min.X); + MoveY = (FMath::Abs(OtherPortal->Min.Y - Max.Y) < FMath::Abs(OtherPortal->Max.Y - Min.Y)) ? (OtherPortal->Min.Y - Max.Y) : (OtherPortal->Max.Y - Min.Y); + + UE_LOG(LogTemp, Warning, TEXT("Center1 variable is: %s"), *Center.ToString()); + UE_LOG(LogTemp, Warning, TEXT("Center2 variable is: %s"), *OtherPortal->Center.ToString()); + UE_LOG(LogTemp, Warning, TEXT("=================")); + UE_LOG(LogTemp, Warning, TEXT("Min variable is: %s"), *Min.ToString()); + UE_LOG(LogTemp, Warning, TEXT("Max variable is: %s"), *Max.ToString()); + UE_LOG(LogTemp, Warning, TEXT("-----------------")); + UE_LOG(LogTemp, Warning, TEXT("Min variable is: %s"), *OtherPortal->Min.ToString()); + UE_LOG(LogTemp, Warning, TEXT("Max variable is: %s"), *OtherPortal->Max.ToString()); + UE_LOG(LogTemp, Warning, TEXT("=================")); + UE_LOG(LogTemp, Warning, TEXT("MoveX variable is: %f"), MoveX); + UE_LOG(LogTemp, Warning, TEXT("MoveY variable is: %f"), MoveY); + + if (FMath::Abs(MoveX) < FMath::Abs(MoveY)) + { + Min.X += MoveX; + Max.X += MoveX; + Center.X += MoveX; + } + else + { + Min.Y += MoveY; + Max.Y += MoveY; + Center.Y += MoveY; + } + + bMoved = true; + } + } + + UpdatePortal(PortalID, Min, Max, Center); + + return !bMoved; +} + +/** + * Fits a portal to the surface. + * + * @param PortalID The ID of the portal to fit + * @param BoxMin The minimum vector of the bounding box + * @param BoxMax The maximum vector of the bounding box + */ +void UPortalSurface::FitPortalToSurface(int32 PortalID, const FVector BoxMin, const FVector BoxMax) +{ + FVector Min, Max, Center; + GetPortal(PortalID, Min, Max, Center); + + //UE_LOG(LogTemp, Warning, TEXT("LocalHitLocation before adjustment: %s"), *Center.ToString()) + + if (Min.X < BoxMin.X) { + float Delta = BoxMin.X - Min.X; + Min.X += Delta; + Max.X += Delta; + Center.X += Delta; + } + if (Max.X > BoxMax.X) { + float Delta = Max.X - BoxMax.X; + Min.X -= Delta; + Max.X -= Delta; + Center.X -= Delta; + } + if (Min.Y < BoxMin.Y) { + float Delta = BoxMin.Y - Min.Y; + Min.Y += Delta; + Max.Y += Delta; + Center.Y += Delta; + } + if (Max.Y > BoxMax.Y) { + float Delta = Max.Y - BoxMax.Y; + Min.Y -= Delta; + Max.Y -= Delta; + Center.Y -= Delta; + } + + UpdatePortal(PortalID, Min, Max, Center); + + //UE_LOG(LogTemp, Warning, TEXT("LocalHitLocation before adjustment: %s"), *Center.ToString()) +} + +/** + * Iterates over the portal TMap and processes each item + */ +void UPortalSurface::IterateMap() +{ + TArray Managers; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), ManagerClass, Managers); + APortal3Manager* PortalManager = Cast(Managers[0]); + if (PortalManager->OrangePortal && PortalManager->BluePortal) + { + // Iterate over the map + for (const auto& Elem : Portals) + { + int32 Key = Elem.Key; + const FPortalData PortalValue = Elem.Value; + + DrawDebugSphere(GetWorld(), PortalValue.Center + GetOwner()->GetActorLocation(), 30.0f, 12, FColor::Black, false, 5.0f); + + OnProcessMapItem.Broadcast(Key, PortalValue.Center, PortalValue.Rotation); + } + } +} + +/** + * Sets the dynamic mesh + * + * @param InMesh The dynamic mesh to set + */ +void UPortalSurface::SetMesh(UDynamicMesh* InMesh) +{ + Mesh = InMesh; +} + +/** + * Gets the dynamic mesh + * + * @return The dynamic mesh + */ +UDynamicMesh* UPortalSurface::GetMesh() const +{ + return Mesh; +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalV3.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalV3.cpp new file mode 100644 index 0000000..4327a6e --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/PortalV3.cpp @@ -0,0 +1,383 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "PortalV3.h" +#include "PortalSurface.h" +#include "Math/UnrealMathUtility.h" + +// Sets default values +APortalV3::APortalV3() +{ + PrimaryActorTick.bCanEverTick = false; + + /** + * Initializing all the components connected to the portal actor + */ + RootComponent = CreateDefaultSubobject(TEXT("RootComponent")); + RootComponent->Mobility = EComponentMobility::Movable; + + PortalMesh = CreateDefaultSubobject(TEXT("Portal")); + PortalMesh->SetupAttachment(RootComponent); + + /** + * We use a construction helper to find the portal plane asset. + * This might not be the best way going around. A better way would have been to have + * a staticmesh component and select the reference shape it in the editor. + * This possible prevents overwriting the original plane asset. + */ + static ConstructorHelpers::FObjectFinder PlaneMeshAsset(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Plane.Shape_Plane'")); + if (PlaneMeshAsset.Succeeded()) + { + PortalMesh->SetStaticMesh(PlaneMeshAsset.Object); + PortalMesh->SetRelativeLocation(FVector(0, 0, 0)); + PortalMesh->SetRelativeRotation(PortalRotation); // y,z,x + PortalMesh->SetRelativeScale3D(PortalScale); + PortalMesh->SetCollisionProfileName(TEXT("NoCollision")); + } + else + { + UE_LOG(LogTemp, Error, TEXT("PortalMesh is a nullptr")); + } + + /** + * We also generate a box component around the portal plane. + * this is used to check for player teleportation. The collision response is set to overlap as + * no hard solid collisions are required. + */ + BoxCheck = CreateDefaultSubobject(TEXT("BoxCollider")); + BoxCheck->SetRelativeScale3D(PortalRotation.RotateVector(PortalScale)); + BoxCheck->SetBoxExtent(FVector(100,50,50)); + + BoxCheck->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + BoxCheck->SetCollisionResponseToAllChannels(ECR_Ignore); + BoxCheck->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Overlap); + + /** + * Creating a USceneCaptureComponent which is basically a virtual camera, + * used for capturing what the player sees through the portal. + */ + SceneCapture = CreateDefaultSubobject(TEXT("PortalSceneCapture")); + SceneCapture->SetupAttachment(RootComponent); + + SceneCapture->bCaptureEveryFrame = false; + SceneCapture->bCaptureOnMovement = false; + SceneCapture->LODDistanceFactor = 3; + SceneCapture->TextureTarget = nullptr; + SceneCapture->bEnableClipPlane = true; + SceneCapture->bUseCustomProjectionMatrix = true; + SceneCapture->CaptureSource = ESceneCaptureSource::SCS_SceneColorHDRNoAlpha; + SceneCapture->bAlwaysPersistRenderingState = true; + + SceneCapture->PrimitiveRenderMode = ESceneCapturePrimitiveRenderMode::PRM_RenderScenePrimitives; + + //Setup Post-Process of SceneCapture (optimization : disable Motion Blur, etc) + FPostProcessSettings CaptureSettings; + + CaptureSettings.bOverride_AmbientOcclusionQuality = true; + CaptureSettings.bOverride_MotionBlurAmount = true; + CaptureSettings.bOverride_SceneFringeIntensity = true; + CaptureSettings.bOverride_ScreenSpaceReflectionQuality = true; + + CaptureSettings.AmbientOcclusionQuality = 0.0f; + CaptureSettings.MotionBlurAmount = 0.0f; + CaptureSettings.SceneFringeIntensity = 0.0f; + CaptureSettings.ScreenSpaceReflectionQuality = 0.0f; + + // Additional overrides + CaptureSettings.bOverride_AutoExposureMinBrightness = true; + CaptureSettings.bOverride_AutoExposureMaxBrightness = true; + CaptureSettings.AutoExposureMinBrightness = 0.03f; + CaptureSettings.AutoExposureMaxBrightness = 2.0f; + CaptureSettings.bOverride_AutoExposureBias = true; + CaptureSettings.AutoExposureBias = 0.0f; + CaptureSettings.bOverride_AutoExposureLowPercent = true; + CaptureSettings.AutoExposureLowPercent = 10.0f; + CaptureSettings.bOverride_AutoExposureHighPercent = true; + CaptureSettings.AutoExposureHighPercent = 90.0f; + + SceneCapture->PostProcessSettings = CaptureSettings; +} + +void APortalV3::BeginPlay() +{ + Super::BeginPlay(); + + /** + * During Beginplay, the material instances are created and set. + * So that each portal has a unique material reference. + */ + + DynamicMaterialInstance = UMaterialInstanceDynamic::Create(Material, this); + DynamicMaterialInstance->SetFlags(RF_Transient); + + PortalMesh->SetMaterial(0, DynamicMaterialInstance); + + UpdateTextureTarget(FVector2D(512, 512)); + + SceneCapture->TextureTarget = PortalTexture; + + DynamicMaterialInstance->SetTextureParameterValue(TEXT("Texture"), PortalTexture); + DynamicMaterialInstance->SetVectorParameterValue(TEXT("PortalEdge"), PortalEdgeColor); +} + +/** + * Updates the screen capture with new parameters. + * + * @param Position The new position for the screen capture. + * @param Rotation The new rotation for the screen capture. + * @param ViewProjectionMatrix The new view projection matrix. + * @param Target The target portal transform. + * @param ProjectionMatrix The projection matrix. + */ +void APortalV3::UpdateScreenCapture(FVector NewLocation, FQuat NewRotation, FMatrix ViewProjectionMatrix, FTransform Target, FMatrix ProjectionMatrix) +{ + ViewProjectionMatrix = ViewProjectionMatrix.GetTransposed(); + + FVector4 VecX, VecY, VecZ, VecW; + BreakMatrix(ViewProjectionMatrix, VecX, VecY, VecZ, VecW); + + DynamicMaterialInstance->SetVectorParameterValue(TEXT("VPX"), FVector4(VecX.X, VecX.Y, VecX.Z, VecX.W)); + DynamicMaterialInstance->SetVectorParameterValue(TEXT("VPY"), FVector4(VecY.X, VecY.Y, VecY.Z, VecY.W)); + DynamicMaterialInstance->SetVectorParameterValue(TEXT("VPW"), FVector4(VecW.X, VecW.Y, VecW.Z, VecW.W)); + + SceneCapture->SetWorldLocation(NewLocation); + SceneCapture->SetWorldRotation(NewRotation); + + SceneCapture->ClipPlaneNormal = Target.GetRotation().GetForwardVector(); + SceneCapture->ClipPlaneBase = Target.GetLocation() + (SceneCapture->ClipPlaneNormal * -1.5f); + + SceneCapture->CustomProjectionMatrix = ProjectionMatrix; + + SceneCapture->CaptureScene(); + + /** + * Two Textures are used to alternate. This help creating semi-recursion for the portals. + * As one Texture can not display itself via a scenecapture component. + */ + if (bUsingPrimaryTextureTarget) + { + SceneCapture->TextureTarget = PortalTexture; + bUsingPrimaryTextureTarget = false; + DynamicMaterialInstance->SetTextureParameterValue(TEXT("Texture"), PortalTexture2); + } + else + { + SceneCapture->TextureTarget = PortalTexture2; + bUsingPrimaryTextureTarget = true; + DynamicMaterialInstance->SetTextureParameterValue(TEXT("Texture"), PortalTexture); + } +} + +/** + * Updates the screen capture resources. + */ +void APortalV3::NullScreenCapture() +{ + PortalTexture->UpdateResource(); + PortalTexture2->UpdateResource(); +} +/** + * Updates the 2 texture targets. If the texture target objects do not yet exist, + * it creates them and sets their default values. If the texture target objects do exist, + * checks if the screen size changed, and if so updates the texture size. + * + * @param Size The new size for the texture target. + */ +void APortalV3::UpdateTextureTarget(FVector2D Size) +{ + if (PortalTexture == nullptr && PortalTexture2 == nullptr) + { + PortalTexture = NewObject(this, UTextureRenderTarget2D::StaticClass(), *FString("PortalRenderTarget")); + PortalTexture2 = NewObject(this, UTextureRenderTarget2D::StaticClass(), *FString("PortalRenderTarget2")); + + PortalTexture->RenderTargetFormat = ETextureRenderTargetFormat::RTF_RGBA8_SRGB; + PortalTexture->Filter = TextureFilter::TF_Default; + PortalTexture->ClearColor = FColor::Black; + PortalTexture->bNeedsTwoCopies = false; + PortalTexture->AddressX = TextureAddress::TA_Clamp; + PortalTexture->AddressY = TextureAddress::TA_Clamp; + + PortalTexture2->RenderTargetFormat = ETextureRenderTargetFormat::RTF_RGBA8_SRGB; + PortalTexture2->Filter = TextureFilter::TF_Default; + PortalTexture2->ClearColor = FColor::Black; + PortalTexture2->bNeedsTwoCopies = false; + PortalTexture2->AddressX = TextureAddress::TA_Clamp; + PortalTexture2->AddressY = TextureAddress::TA_Clamp; + + PortalTexture->SizeX = 1524; + PortalTexture->SizeY = FMath::RoundToInt(1524 * Size.Y / Size.X); + + PortalTexture2->SizeX = 1524; + PortalTexture2->SizeY = FMath::RoundToInt(1524 * Size.Y / Size.X); + + OldSize = Size; + + PortalTexture->UpdateResource(); + PortalTexture2->UpdateResource(); + } + else if (Size != OldSize && PortalTexture != nullptr && PortalTexture2 != nullptr) + { + OldSize = Size; + + PortalTexture->SizeX = 1524; + PortalTexture->SizeY = FMath::RoundToInt(1524 * Size.Y / Size.X); + PortalTexture2->SizeX = 1524; + PortalTexture2->SizeY = FMath::RoundToInt(1524 * Size.Y / Size.X); + + PortalTexture->UpdateResource(); + PortalTexture2->UpdateResource(); + } +} + +/** + * Deprecated! Debugs the collider used for teleportation checks by drawing a debug box in the world. + */ +void APortalV3::DebugCollider() +{ + DrawBox(GetWorld(), GetActorLocation(), FColor::Purple, -1); +} + +/** + * Gets the coordinates of the bounds of the portal. + * However, it discards one dimension as the portal plane is a "plane" not a box. + * + * @return An array of vectors representing the bounds of the portal. + */ +TArray APortalV3::GetPortalBounds() +{ + TArray PortalBounds; + + FBox MeshBox = PortalMesh->GetStaticMesh()->GetBounds().GetBox(); + FTransform Transform(PortalRotation + FRotator(0.f, 90.f, 0.f), GetActorLocation(), PortalScale); + + /** + * iterating through all corners of a standard bounds box. + */ + for (int32 i = 0; i < 8; i++) + { + FVector LocalCorner( + (i & 1) ? MeshBox.Max.X : MeshBox.Min.X, + (i & 2) ? MeshBox.Max.Y : MeshBox.Min.Y, + MeshBox.Min.Z + ); + PortalBounds.Add(Transform.TransformPosition(LocalCorner)); + } + return PortalBounds; +} + +/** + * Resizes the static mesh to the defined portal scale. + */ +void APortalV3::ResizeStaticMesh() +{ + PortalMesh->SetRelativeScale3D(PortalScale); +} + +/** + * Draws a box in the world, ONLY when using the EDITOR. Used in combination with DebugCollider. + * + * @param World The world context. + * @param WorldOffset The offset of the box in the world. + * @param Color The color of the box. + * @param Duration The duration for which the box should be drawn. + */ +void APortalV3::DrawBox(UWorld* World, const FVector& WorldOffset, const FColor& Color, float Duration) +{ + if (GEngine) + { + FVector BoxCenter = BoxCheck->GetComponentLocation(); + FVector BoxExtent = BoxCheck->GetScaledBoxExtent(); + + DrawDebugBox(GetWorld(), BoxCenter + GetActorLocation(), BoxExtent, GetActorQuat(), Color, false, Duration, 0, 1); + } +} + +/** + * Checks if a point is inside the portal collider box. + * In order to work with the possible rotations, normalizes the rotation and location to absolute local coordinates. + * + * @param Point The point to check. + * @return True if the point is inside the portal, false otherwise. + */ +bool APortalV3::IsInside(FVector Point) +{ + FVector Offset = GetActorLocation(); + FVector BoxCenter = BoxCheck->GetComponentLocation(); + FVector BoxExtent = BoxCheck->GetScaledBoxExtent(); + + FVector DirectionX = BoxCheck->GetForwardVector(); + FVector DirectionY = BoxCheck->GetRightVector(); + FVector DirectionZ = BoxCheck->GetUpVector(); + + FVector Direction = Point - Offset; + + Direction = GetActorRotation().GetInverse().RotateVector(Direction); + + bool IsInside = FMath::Abs(Direction.X) <= BoxExtent.X && FMath::Abs(Direction.Y) <= BoxExtent.Y && FMath::Abs(Direction.Z) <= -BoxExtent.Z; + + return IsInside; +} + +/** + * Breaks a view projection matrix into its component vectors. + * Which is then used in the portal material instance to correctly calculate the screen space coordinates. + * + * @param InMatrix The input matrix to break. + * @param OutX The output X vector. + * @param OutY The output Y vector. + * @param OutZ The output Z vector. + * @param OutW The output W vector. + */ +bool APortalV3::BreakMatrix(const FMatrix& InMatrix, FVector4& OutX, FVector4& OutY, FVector4& OutZ, FVector4& OutW) +{ + if (sizeof(InMatrix.M) / sizeof(InMatrix.M[0]) != 4 || sizeof(InMatrix.M[0]) / sizeof(int) != 8) + { + return false; + } + + OutX = FVector4(InMatrix.M[0][0], InMatrix.M[0][1], InMatrix.M[0][2], InMatrix.M[0][3]); + OutY = FVector4(InMatrix.M[1][0], InMatrix.M[1][1], InMatrix.M[1][2], InMatrix.M[1][3]); + OutZ = FVector4(InMatrix.M[2][0], InMatrix.M[2][1], InMatrix.M[2][2], InMatrix.M[2][3]); + OutW = FVector4(InMatrix.M[3][0], InMatrix.M[3][1], InMatrix.M[3][2], InMatrix.M[3][3]); + + return true; +} + +/** + * Destroys the portal and removes its link to the linked portal. + */ +void APortalV3::PortalDestroySelf() +{ + if (LinkedPortal != nullptr) + { + LinkedPortal->LinkedPortal = nullptr; + UE_LOG(LogTemp, Warning, TEXT("Destroying the link")) + } + PortalSurface->RemovePortal(SurfaceId); + Destroy(); +} + +/** + * Sets the surface data for the portal. The surface data, is a reference to the surface static mesh, + * which this portal is placed on. + * + * @param Index The index of the surface. + * @param PortalSurfaceData The surface data pointer. + */ +void APortalV3::SetSurfaceData(int32 Index, UPortalSurface* PortalSurfaceData) +{ + PortalSurface = PortalSurfaceData; + SurfaceId = Index; +} + +/** + * Sets the portal color edge color. + * + * @param ColorIn The new color for the portal edge. + */ +void APortalV3::SetPortalColor(FVector ColorIn) +{ + PortalEdgeColor = ColorIn; + DynamicMaterialInstance->SetVectorParameterValue(TEXT("PortalEdge"), PortalEdgeColor); +} + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Private/TeleportAgent.cpp b/UE5/Cpp/G3NTs/Source/Portal2/Private/TeleportAgent.cpp new file mode 100644 index 0000000..8defb64 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Private/TeleportAgent.cpp @@ -0,0 +1,236 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#include "TeleportAgent.h" +#include "C:/Users/G3NTs/Documents/Unreal Projects/Portal2/Source/Portal2/TP_WeaponComponent.h" +#include "Materials/MaterialInterface.h" +#include "Engine/SkinnedAssetCommon.h" +#include "Portal3Manager.h" + +UTeleportAgent::UTeleportAgent() +{ + PrimaryComponentTick.bCanEverTick = false; + + bIsCloned = false; + bDoNotTeleport = false; +} + +void UTeleportAgent::BeginPlay() +{ + Super::BeginPlay(); + + if (AActor* Owner = GetOwner()) + { + UPrimitiveComponent* RootComponent = Cast(GetOwner()->GetRootComponent()); + CollisionProfileName = RootComponent->GetCollisionProfileName(); + + if (UWorld* World = Owner->GetWorld()) + { + /** + * Dynamic material instances are assigned to the teleportable actors in order to get the clip plane working. + * Without the dynamic material instances, the clip plane would not update. + * Two mesh component types are assigned the correct materials. One is the Skeletal mesh component, the other the static one. + * The code is made to work with multiple materials per mesh. + */ + if (UStaticMeshComponent* MeshComponent = Owner->FindComponentByClass()) + { + int32 MaterialCount = MeshComponent->GetNumMaterials(); + DynamicMaterialInstances.SetNum(MaterialCount); + for (int32 i = 0; i < MaterialCount; ++i) + { + UMaterialInterface* Material = MeshComponent->GetMaterial(i); + if (Material) + { + DynamicMaterialInstances[i] = UMaterialInstanceDynamic::Create(Material, this); + MeshComponent->SetMaterial(i, DynamicMaterialInstances[i]); + } + } + } + TArray SkeletalMeshComponents; + Owner->GetComponents(SkeletalMeshComponents); + for (USkeletalMeshComponent* SkeletalComponent : SkeletalMeshComponents) + { + for (int32 i = 0; i < SkeletalComponent->GetNumMaterials(); ++i) + { + MaterialInterface = SkeletalComponent->GetMaterial(i); + if (MaterialInterface) + { + UMaterialInstanceDynamic* DynamicMaterialInstance = UMaterialInstanceDynamic::Create(MaterialInterface, this); + SkeletalComponent->SetMaterial(i, DynamicMaterialInstance); + DynamicMaterialInstances.Add(DynamicMaterialInstance); + } + } + } + + /** + * This bit of the code manages initializing the variables of the teleport agent. + * It prevents cloned teleport actors to be cloned again. + */ + for (TActorIterator It(World); It; ++It) + { + APortal3Manager* Manager = *It; + if (Manager) + { + bIsCloned = Manager->GetCloneStatus(); + if (bIsCloned || bDoNotTeleport) + { + return; + } + UE_LOG(LogTemp, Warning, TEXT("Added Actor")); + Manager->HandleActorSpawned(Owner); + return; + } + } + } + } +} + +void UTeleportAgent::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + if (bIsCloned) + { + return; + } + + if (AActor* Owner = GetOwner()) + { + if (UWorld* World = Owner->GetWorld()) + { + for (TActorIterator It(World); It; ++It) + { + APortal3Manager* Manager = *It; + if (Manager) + { + if (bIsCloned || bDoNotTeleport) + { + return; + } + UE_LOG(LogTemp, Warning, TEXT("Removed Actor")); + Manager->HandleActorDestroyed(Owner); + return; + } + } + } + } +} + +/** + * Sets the teleportation status for a given actor + * + * @param Actor The actor whose teleport status is being set + * @param bCanTeleport The new teleport status + */ +void UTeleportAgent::SetTeleportStatus(AActor* Actor, bool bCanTeleport) +{ + bool& ExistingStatus = TeleportStatus.FindOrAdd(Actor, bCanTeleport); + ExistingStatus = bCanTeleport; +} + +/** + * Sets the clipping plane with a specified location and forward vector + * + * @param InLocation The location to set the clip plane + * @param InForwardVector The forward vector for the clip plane + */ +void UTeleportAgent::SetClipPlane(FVector InLocation, FVector InForwardVector) +{ + for (UMaterialInstanceDynamic* DynamicMaterialInstance : DynamicMaterialInstances) + { + DynamicMaterialInstance->SetVectorParameterValue(TEXT("Position"), InLocation - InForwardVector); + DynamicMaterialInstance->SetVectorParameterValue(TEXT("Normal"), -InForwardVector); + DynamicMaterialInstance->SetScalarParameterValue(TEXT("bClipPlaneEnabled"), 1.0f); + } + + AActor* Owner = GetOwner(); + if (!Owner) return; + + TArray AttachedActors; + Owner->GetAttachedActors(AttachedActors); + + for (AActor* AttachedActor : AttachedActors) + { + // Check if the attached actor has a TeleportAgentComponent + UTeleportAgent* AttachedTeleportAgent = AttachedActor->FindComponentByClass(); + if (AttachedTeleportAgent && AttachedTeleportAgent != this) + { + // Apply the same clip plane settings to the attached component + for (UMaterialInstanceDynamic* DynamicMaterialInstance : AttachedTeleportAgent->DynamicMaterialInstances) + { + DynamicMaterialInstance->SetVectorParameterValue(TEXT("Position"), InLocation - InForwardVector); + DynamicMaterialInstance->SetVectorParameterValue(TEXT("Normal"), -InForwardVector); + DynamicMaterialInstance->SetScalarParameterValue(TEXT("bClipPlaneEnabled"), 1.0f); + } + } + } +} + +/** + * Disables the clipping plane + */ +void UTeleportAgent::DisableClipPlane() +{ + for (UMaterialInstanceDynamic* DynamicMaterialInstance : DynamicMaterialInstances) + { + DynamicMaterialInstance->SetScalarParameterValue(TEXT("bClipPlaneEnabled"), 0.0f); + } + AActor* Owner = GetOwner(); + if (!Owner) return; + + TArray AttachedActors; + Owner->GetAttachedActors(AttachedActors); + + for (AActor* AttachedActor : AttachedActors) + { + // Check if the attached actor has a TeleportAgentComponent + UTeleportAgent* AttachedTeleportAgent = AttachedActor->FindComponentByClass(); + if (AttachedTeleportAgent && AttachedTeleportAgent != this) + { + // Apply the same clip plane settings to the attached component + for (UMaterialInstanceDynamic* DynamicMaterialInstance : AttachedTeleportAgent->DynamicMaterialInstances) + { + DynamicMaterialInstance->SetScalarParameterValue(TEXT("bClipPlaneEnabled"), 0.0f); + } + } + } +} + +/** + * Gets the teleportation status for a given actor + * + * @param Actor The actor whose teleport status is being queried + * @return The teleport status of the actor + */ +bool UTeleportAgent::GetTeleportStatus(AActor* Actor) +{ + const bool* TeleportStatusPtr = TeleportStatus.Find(Actor); + if (TeleportStatusPtr) + { + return *TeleportStatusPtr; + } + return false; +} + +/** + * Changes the collision settings for the agent + * + * @param bCollisionEnabled Whether to enable or disable collision + */ +void UTeleportAgent::ChangeAgentCollision(bool bCollisionEnabled) +{ + if (!bCollisionEnabled) + { + UPrimitiveComponent* RootComponent = Cast(GetOwner()->GetRootComponent()); + RootComponent->SetCollisionProfileName(TEXT("PortalAgent")); + } +} + +/** + * Resets the collision settings for the agent to the original settings + */ +void UTeleportAgent::ResetAgentCollision() +{ + UPrimitiveComponent* RootComponent = Cast(GetOwner()->GetRootComponent()); + RootComponent->SetCollisionProfileName(CollisionProfileName); +} + diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/DebugDisplay.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/DebugDisplay.h new file mode 100644 index 0000000..0aab304 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/DebugDisplay.h @@ -0,0 +1,50 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "DebugDisplay.generated.h" + +/** + * This class is currently deprecated. Do not use! + */ +UCLASS() +class PORTAL2_API ADebugDisplay : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + ADebugDisplay(); + +protected: + // Called when the game starts or when spawned + virtual void BeginPlay() override; + +public: + // Called every frame + virtual void Tick(float DeltaTime) override; + + + int32 number = 0; + int32 number2 = 0; + bool bTick; + bool bHasLineOfSightPortalOne; + bool bCapturedSceneLastFrame; + bool bCanTeleportNextUpdate; + bool bHasTeleported; + bool bTeleportTest; + + float X; + float Y; + float Z; + + float rotX; + float rotY; + float rotZ; + + float PDot; + + +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/MyAnimInstance.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/MyAnimInstance.h new file mode 100644 index 0000000..9c76d54 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/MyAnimInstance.h @@ -0,0 +1,50 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Animation/AnimInstance.h" +#include "MyAnimInstance.generated.h" + +/** + * This animation instance is used for the player animation syncing. It contains floats and bools that are used by the animation blueprint to determine its animation state. These are synced through the PortalManager class. + */ +UCLASS() +class PORTAL2_API UMyAnimInstance : public UAnimInstance +{ + GENERATED_BODY() + +public: + UFUNCTION(BlueprintCallable, Category = "Animation") + void SetAnimationPosition(float TimePosition); + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bIsMoving; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bIsInAir; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bHasRifle; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bTransitionUp; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bTransitionDown; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bOverrideBools; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bUpdateBools; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + bool bFire; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + float StartPosition; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Animation") + float OutPosition; +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/Portal3Manager.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/Portal3Manager.h new file mode 100644 index 0000000..67597b3 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/Portal3Manager.h @@ -0,0 +1,430 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "Kismet/GameplayStatics.h" +#include "Engine/World.h" +#include "TeleportAgent.h" +#include "EngineUtils.h" + +#include "PortalV3.h" +#include "DebugDisplay.h" + +#include "GameFramework/PlayerController.h" +#include "GameFramework/Character.h" +#include "GameFramework/CharacterMovementComponent.h" + +#include "Portal3Manager.generated.h" + +/** +* Forward declarations, to prevent circular dependecies. +*/ +class APortal2Projectile; +class ABP_PortalV2; +class UPortalSurface; + +/** + * Structure used to create a key of a combination between portal and teleportable actor. + * In other words, it creates a reference to a combination. This struct is used to find and store cloned actor references, + * so that a clone can be updated in accordance with the original actor. As well as to prevent duplicate clones. + */ +USTRUCT(BlueprintType) +struct FAgentPortalKey +{ + GENERATED_BODY() + +public: + UPROPERTY(BlueprintReadOnly) + AActor* Agent; // Pointer to the original agent actor + + UPROPERTY(BlueprintReadOnly) + APortalV3* Portal; // Pointer to the portal associated with the cloned actor + + FAgentPortalKey() : Agent(nullptr), Portal(nullptr) {} + + FAgentPortalKey(AActor* InAgent, APortalV3* InPortal) + : Agent(InAgent), Portal(InPortal) + {} + + /** + * Comparison operator to check equality of FAgentPortalKey objects. + * + * @param Other The other FAgentPortalKey object to compare with. + * @return True if both Agent and Portal pointers are equal, false otherwise. + */ + bool operator==(const FAgentPortalKey& Other) const + { + return Agent == Other.Agent && Portal == Other.Portal; + } + + /** + * Hash function to generate a unique hash value for FAgentPortalKey objects. This way, the key per combination is unique. + * + * @param Key The FAgentPortalKey object for which to generate the hash. + * @return The hash value based on Agent and Portal pointers. + */ + friend uint32 GetTypeHash(const FAgentPortalKey& Key) + { + return GetTypeHash(Key.Agent) ^ GetTypeHash(Key.Portal); + } +}; + +/** + * Manager class responsible for handling portals and teleportation mechanics in the game. + */ +UCLASS() +class PORTAL2_API APortal3Manager : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + APortal3Manager(); + +private: + FActorTickFunction SecondaryActorTick; + bool bCloneState; + +private: + /** + * Important Maps Storing both the actors that can be teleported as well as the cloned actors. + */ + + UPROPERTY(VisibleAnywhere) + TMap TeleportAgents; + + UPROPERTY(VisibleAnywhere) + TMap ClonedActors; + + UPROPERTY(VisibleAnywhere) + TArray PortalList; + + // Class that needs to be set before running the game! + UPROPERTY(EditAnywhere) + TSubclassOf ABP_PortalV2; + +public: + UPROPERTY(EditAnywhere) + APlayerController* PlayerController; + + // Actor pointers, for public access from other classes + + UPROPERTY(VisibleAnywhere) + APortalV3* OrangePortal; + + UPROPERTY(VisibleAnywhere) + APortalV3* BluePortal; + +protected: + virtual void BeginPlay() override; + virtual void RegisterActorTickFunctions(bool bRegister) override; + virtual void TickActor(float DeltaSeconds, ELevelTick TickType, FActorTickFunction& ThisTickFunction) override; + +private: + /* + * StandAlone functions that do not require input arguments + */ + + /** + * Updates the capture state of all portals in the PortalList. + * + * This function iterates through each portal in the PortalList and checks if the portal has a linked portal. + * If a linked portal is found, it calculates the necessary transforms and updates the portal's screen capture + * to reflect the current state of the camera relative to the portal and its linked portal. + */ + void UpdatePortals(); + + /** + * Checks and manages teleportation for each agent in the TeleportAgents map. + * Iterates through each agent and evaluates its position relative to portals in the PortalList. + * Manages teleportation status, collision settings, and clip plane for each teleport agent. + */ + void TeleportActorsCheck(); + + /** + * Iterates through all teleport agents and checks their teleport status for each portal. + * Clones or updates actors based on teleport status. Removes cloned actors if teleport + * status is false for a portal. + * Could possibly have been combined with Teleport Actors Check function! + */ + void CloneOrUpdateAllActors(); + +public: + // Functions for the modifying the Teleportable Actors Map + + /** + * Function that can be called to add a actor with the UTeleportAgent component to the teleportable actors map. + */ + void HandleActorSpawned(AActor* Actor); + + /** + * Function that can be called to remove a actor with the UTeleportAgent component to the teleportable actors map. + */ + void HandleActorDestroyed(AActor* Actor); + + // Functions for the modifying the ClonedActorMap + + /** + * Finds the cloned actor corresponding to the given Agent and Portal. + * + * @param Agent The original actor that was cloned. + * @param Portal The portal through which the actor was cloned. + * @return The cloned actor corresponding to Agent and Portal, or nullptr if not found. + */ + AActor* FindClonedActor(AActor* Agent, APortalV3* Portal); + + /** + * Stores the cloned actor corresponding to the given Agent and Portal in the ClonedActors map. + * + * @param Agent The original actor that was cloned. + * @param Portal The portal through which the actor was cloned. + * @param ClonedActor The cloned actor to store. + */ + void StoreClonedActor(AActor* Agent, APortalV3* Portal, AActor* ClonedActor); + + /** + * Removes the cloned actor associated with the given Agent and Portal from the ClonedActors map and destroys it. + * + * @param Agent The original actor whose clone needs to be removed. + * @param Portal The portal associated with the cloned actor to be removed. + */ + void RemoveClonedActor(AActor* Agent, APortalV3* Portal); + + /** + * Creates a new portal in the world at the specified location and rotation. + * Adds a portal reference to a UPortalSurface component for later referencing. + * If it's the orange portal, links it with the blue portal, + * and updates visuals. If it's the blue portal, does the reverse. + * + * @param PortalCenter The center position of the portal. + * @param PortalRotation The rotation of the portal. + * @param bIsOrangePortal Indicates if the portal being created is the orange portal. + * @param PortalSurfaceData The surface data associated with the portal. + * @param Index The index of the portal in the list. + */ + void CreateNewPortal(FVector PortalCenter, FQuat PortalRotation, bool bIsOrangePortal, UPortalSurface* PortalSurfaceData, int32 Index); + + /** + * Destroys the existing orange or blue portal based on the specified flag. + * Updates the PortalList array after destruction. + * + * @param bIsOrangePortal True if destroying the orange portal, false for the blue portal. + */ + void DestroyOldPortal(bool bIsOrangePortal); + + /** + * Public function to assign a bIsCloned status to TeleportAgents. This status is based on what moment during + * the tick function this function is called. It is a rusty solution to spawning blueprints with variables attached. + * + * @return True is the actor was cloned instead of original. + */ + bool GetCloneStatus(); + +private: + /** + * Updates the screen capture for the specified portal. + * + * This function calculates the new capture location and rotation for the portal based on the provided + * reference, target, and camera transforms. It then retrieves the camera's view projection and projection + * matrices, and uses these values to update the portal's screen capture. + * + * @param Portal The portal to update. + * @param Reference The reference transform used for coordinate conversion, the main portal. + * @param Target The transform of the linked portal. + * @param Camera The current transform of the camera. + */ + void UpdatePortalCapture(APortalV3* Portal, FTransform Reference, FTransform Target, FTransform Camera); + + /** + * Deprecated! No longer used in the final version of the code + */ + void UpdateDebugDisplay(ADebugDisplay* DebugDisplayActor); + + /** + * Resets the control and actor rotations of the player character smoothly using spherical linear interpolation (SLERP). + * This function corrects the player's orientation after passing through portals that may have altered their rotation. + * + * @param DeltaTime The time elapsed since the last frame. + */ + void ResetRotationControllerSlerp(float DeltaTime); + + /** + * Clones or updates the specified agent in the context of the given portal. + * + * This function checks if the agent already has a cloned counterpart associated with the portal. + * If no cloned actor is found, it creates a new clone of the agent. + * If a cloned actor exists, it updates the cloned actor's state to match the agent. + * Finally, it sets the clip plane on the cloned actor's teleport agent component based on the linked portal's location and forward vector. + * + * @param Agent The actor to be cloned or updated. + * @param Portal The portal that influences the cloning or updating process. + */ + void CloneOrUpdateActor(AActor* Agent, APortalV3* Portal); + + /** + * Clones the specified actor through the given portal. + * Depending on the type of actor (player character, projectile, or static mesh), + * it handles cloning and transformation appropriately. + * + * @param Agent The actor to be cloned. + * @param Portal The portal through which the actor will be cloned. + */ + void CloneActor(AActor* Agent, APortalV3* Portal); + + /** + * Updates the cloned actor's position, rotation, and other properties based on the agent's state + * and the portal through which it was cloned. Depending on the type of actor (player character, projectile, or static mesh), + * it handles cloning and transformation appropriately. + * + * @param Agent The original actor whose clone is being updated. + * @param ClonedActor The cloned actor that needs to be updated. + * @param Portal The portal through which the actor was cloned. + */ + void UpdateClonedActor(AActor* Agent, AActor* ClonedActor, APortalV3* Portal); + + /** + * Teleports the specified actor through the given portal. + * + * @param Agent The actor to teleport. + * @param Portal The portal through which the actor will be teleported. + */ + void TeleportActor(AActor* Agent, APortalV3* Portal); + + /** + * Maps all actors in the world that have a UTeleportAgent component, excluding those with bDoNotTeleport set to true. + * + * @param World The world context to search for actors. + * @param OutActors The output map where mapped actors will be stored (Key: Actor with UTeleportAgent component, Value: Actor itself). + */ + void MapAllActorsWithComponent(UWorld* World, TMap& OutActors); + + + /* + * Bool functions + */ + + /** + * Checks if the portal needs an update based on the current camera and portal transforms. + * + * This function compares the provided current transforms of the portal to check wether or not the portal texture should be rendered this frame. + * + * @param Portal The portal actor being checked. + * @param PortalTransform The current transform of the portal. + * @param CameraTransform The current transform of the camera. + * @return true if the portal needs an update, false otherwise. + */ + bool CheckPortalNeedsUpdate(APortalV3* Portal, FTransform Reference, FTransform Camera); + + /** + * Checks if the player is within a specified distance threshold from a reference point. + * Prevents problems with updating the portal textures when the player moves through. + * + * @param Reference The transform representing the reference point. + * @param Camera The transform representing the player's camera position. + * @return True if the player is within 100 units of the reference point, false otherwise. + */ + bool PlayerPortalDistance(FTransform Reference, FTransform Camera); + + /** + * Checks if the camera or actor transform is in front of a reference plane defined by a transform. + * + * @param Reference The transform representing the reference point and orientation of the plane. + * @param Camera The transform representing the camera or actor position to check. + * @return True if the camera or actor position is in front of the reference plane, false otherwise. + */ + bool CheckActorInFront(FTransform Reference, FTransform Camera); + + /** + * Checks if the player's camera has a clear line of sight to any corner of a portal, using raycasting. + * + * @param PortalBounds Array of corner points defining the bounding volume of the portal in world space. + * @param Camera Transform representing the player's camera position and orientation. + * @param Portal Pointer to the portal actor to exclude from the raycast checks (to avoid self-intersection). + * @return True if there is a clear line of sight from the camera to any portal corner, false otherwise. + */ + bool CheckPlayerPortalLineOfSigth(TArray PortalBounds, FTransform Camera, AActor* Portal); + + /** + * Performs a line trace to check if there are any obstructions between two points (Start and End). + * + * @param Start The starting point of the raycast. + * @param End The end point of the raycast. + * @param Portal Pointer to the portal actor to exclude from the raycast check (to avoid self-intersection). + * @return True if there are no obstructions between Start and End, or if the only obstruction is the Portal itself. False otherwise. + */ + bool RaycastClear(const FVector& Start, const FVector& End, AActor* Portal); + + /** + * Updates the viewport size and applies it to all portals or a single one. + * + * @param APortalV3 Reference, if provided, the function will only update the specific portal reference. + * @return True if the viewport size was successfully retrieved, false if default size was used. + */ + bool UpdateViewportSize(APortalV3* Portal = nullptr); + + /* + * Return Functions + */ + + /** + * Converts a location from one actor's space (Camera) to another actor's space (Target) based on a reference actor (Reference). + * In the portal project, this is used to both teleport actors and update screencapture camera positions. + * + * @param Camera The transform of the camera or source actor from which the location is being converted. + * @param Reference The transform of the reference actor to which the Camera's location is relative. + * @param Target The transform of the target actor to which the converted location is relative. + * @return The location vector converted to the space of the Target actor. + */ + FVector ConvertLocationToActorSpace(FTransform Camera, FTransform Reference, FTransform Target); + + /** + * Converts a rotation from one actor's space (Camera) to another actor's space (Target) based on a reference actor (Reference). + * In the portal project, this is used to both rotate teleported actors and update screencapture camera rotations. + * + * @param Camera The transform of the camera or source actor from which the rotation is being converted. + * @param Reference The transform of the reference actor to which the Camera's rotation is relative. + * @param Target The transform of the target actor to which the converted rotation is relative. + * @return The rotation quaternion converted to the space of the Target actor. + */ + FQuat ConvertRotationToActorSpace(FTransform Camera, FTransform Reference, FTransform Target); + + /** + * Converts a velocity vector from one actor's space (Reference) to another actor's space (Target). + * In the portal project, this is used to update the velocity vector of teleported actors. + * + * @param Object The velocity vector of the object in the Reference actor's space. + * @param Reference The transform of the reference actor whose space the velocity is relative to. + * @param Target The transform of the target actor to which the converted velocity should be relative. + * @return The velocity vector converted to the space of the Target actor. + */ + FVector ConvertVelocityToActorSpace(FVector Object, FTransform Reference, FTransform Target); + + /** + * Retrieves the camera projection matrix based on the current view or projection settings. + * + * @param CameraManagerIn The player camera manager instance that manages the camera settings. + * @param bIsView Flag indicating whether to retrieve the view matrix (true) or projection matrix (false). + * @return The requested matrix (ViewProjectionMatrix if bIsView is true, ProjectionMatrix if false). + */ + FMatrix GetCameraProjectionMatrix(APlayerCameraManager* CameraManagerIn, bool bIsView); + + /* + * Template Functions || would do really well in a seperate function library + */ + + /** + * Finds all actors of a specified subclass in the world that inherit from a given base class. + * This function uses UGameplayStatics::GetAllActorsOfClass to gather all actors of the specified BaseClass, + * then attempts to cast each found actor to SubClass. If successful, it adds the casted actor pointer to + * an array which is returned at the end. + * + * @tparam SubClass The subclass of AActor to search for. + * @param World The world context to search for actors. + * @param BaseClass The base class from which SubClass inherits. + * @return An array of pointers to actors of SubClass found in the world. May be empty if none are found. + */ + template + TArray FindAllActorsInWorld(UWorld* World, TSubclassOf BaseClass); +}; \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalBullet.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalBullet.h new file mode 100644 index 0000000..6ca60c5 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalBullet.h @@ -0,0 +1,113 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" + +#include "Particles/ParticleSystemComponent.h" + +#include "NiagaraComponent.h" + +#include "GameFramework/PlayerController.h" + +#include "PortalSurface.h" +#include "Portal3Manager.h" + +#include "PortalBullet.generated.h" + +class UProjectileMovementComponent; +class USphereComponent; +class APortal3Manager; + +UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent)) +class PORTAL2_API APortalBullet : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + APortalBullet(); + +private: + UPROPERTY(EditDefaultsOnly, Category = "G3NTs|Portal") + class USphereComponent* SphereCollision; + + UPROPERTY(EditDefaultsOnly, Category = "G3NTs|Portal") + class UProjectileMovementComponent* ProjectileMovement; + + UPROPERTY(EditDefaultsOnly, Category = "G3NTs|Portal") + class UNiagaraComponent* NiagaraComponent; + + UPROPERTY(EditDefaultsOnly, Category = "G3NTs|Portal") + TSubclassOf BP_Portal3Manager; + +public: + UPROPERTY(EditDefaultsOnly, Category = "G3NTs|Portal") + bool bIsOrangePortal; + +private: + /** + * Called when the projectile hits something + * + * @param HitComp The component that was hit + * @param OtherActor The other actor involved in the collision + * @param OtherComp The other component involved in the collision + * @param NormalImpulse The force of the impact + * @param Hit Detailed information about the hit + */ + UFUNCTION() + void OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit); + + /** + * Called when the projectile overlaps another object + * + * @param OverlappedComponent The component that was overlapped + * @param OtherActor The other actor involved in the overlap + * @param OtherComp The other component involved in the overlap + * @param OtherBodyIndex The index of the other body + * @param bFromSweep Whether the overlap was from a sweep + * @param SweepResult Detailed information about the sweep + */ + UFUNCTION() + void OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + + /** + * Finds the minimum and maximum vectors among the given points + * + * @param BR_Point Bottom-right point + * @param BL_Point Bottom-left point + * @param TR_Point Top-right point + * @param TL_Point Top-left point + * @return A pair containing the minimum and maximum vectors + */ + std::pair FindMinMax(const FVector& BR_Point, const FVector& BL_Point, const FVector& TR_Point, const FVector& TL_Point); + + /** + * Adjusts the portal's position on the surface + * + * @param PortalSurfaceData The portal surface data component + * @param LocalPortalMin The local minimum vector of the portal + * @param LocalPortalMax The local maximum vector of the portal + * @param PortalCenter The center point of the portal + * @param SurfaceOrigin The origin of the surface + * @param SurfaceExtend The extent of the surface + * @param Index The index of the portal + * @param Displacement The displacement vector + * @param Rotation The rotation of the portal + * @return true if the portal's position is adjusted, false otherwise + */ + bool AdjustPortalPosition(UPortalSurface* PortalSurfaceData, FVector& LocalPortalMin, FVector& LocalPortalMax, FVector& PortalCenter, const FVector& SurfaceOrigin, const FVector& SurfaceExtend, int32& Index, FVector& Displacement, FRotator& Rotation); + + /** + * Spawns the portal on the surface + * + * @param PortalCenter The center point of the portal + * @param PortalRotation The rotation of the portal + * @param SurfaceForwardVector The forward vector of the surface + * @param PortalSurfaceData The portal surface data component + * @param Index The index of the portal + */ + void SpawnPortalOnSurface(FVector PortalCenter, FQuat PortalRotation, FVector SurfaceForwardVector, UPortalSurface* PortalSurfaceData, int32 Index); + +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalSurface.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalSurface.h new file mode 100644 index 0000000..b088ff0 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalSurface.h @@ -0,0 +1,208 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "Components/DynamicMeshComponent.h" +#include "DynamicMeshBuilder.h" +#include "UDynamicMesh.h" +#include "Components/StaticMeshComponent.h" +#include "PortalSurface.generated.h" + +class APortal3Manager; + +/** + * Event called to send a portal data set into the blueprint. + * + * It takes three parameters: + * - int32 - Key of the portal item + * - FVector - Vector storing the center point of the portal actor. + * - FRotator - FRotator storing the rotation of the portal actor. + */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnProcessMapItem, + int32, key, + FVector, Center, + FRotator, Rotation +); + +/** + * Delegate to fire a event in blueprints to rebuild collisions on the surface mesh. + * Delegates require an empty class assignment, + * this functions as a handle which can be used to fire the event. + */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FRebuildCollision); + +/** + * Structure to combine variables into a single value class for a TMap. + */ +USTRUCT(BlueprintType) +struct FPortalData +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + FVector Min; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + FVector Max; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + FVector Center; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + FRotator Rotation; + + FPortalData() : Min(FVector::ZeroVector), Max(FVector::ZeroVector), Center(FVector::ZeroVector), Rotation(FRotator::ZeroRotator) {} + + FPortalData(const FVector& InMin, const FVector& InMax, const FVector& InCenter, const FRotator& InRotation) + : Min(InMin), Max(InMax), Center(InCenter), Rotation(InRotation) {} +}; + +UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) +class PORTAL2_API UPortalSurface : public UActorComponent +{ + GENERATED_BODY() + + int32 UniquePortalId; + +public: + // Sets default values for this component's properties + UPortalSurface(); + +protected: + void BeginPlay() override; + +private: + UPROPERTY(BlueprintAssignable) + FOnProcessMapItem OnProcessMapItem; // Class which a delegate is assigned to. + + UPROPERTY(BlueprintAssignable) + FRebuildCollision RebuildCollision; // Class which a delegate is assigned to. + + UPROPERTY(EditAnywhere, Category = "Portals") + TSubclassOf ManagerClass; // Reference to the portal manager class. + +protected: + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + TMap Portals; // TMap to store portals which are attachted to this surface. + +public: + UDynamicMeshComponent* DynamicMeshComponent; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + UDynamicMesh* Mesh; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Portals") + FVector InlineScale = FVector(1, 1, 1); // A inline scale value, used to rescale the dynamic mesh. As using the actual scale parameters breaks the portal placement algorithm. + +private: + /** + * Sets the dynamic mesh + * + * @param InMesh The dynamic mesh to set + */ + UFUNCTION(BlueprintCallable, Category = "Portals") + void SetMesh(UDynamicMesh* InMesh); + + /** + * Gets the dynamic mesh + * + * @return The dynamic mesh + */ + UFUNCTION(BlueprintCallable, Category = "Portals") + UDynamicMesh* GetMesh() const; + + /** + * Sets the scale of the inline surface mesh, without changing the actual scale of the actor. + * + * @param Scale The scale to set + */ + UFUNCTION(BlueprintCallable, Category = "Portals") + void SetInlineScale(FVector Scale); + + /** + * Gets the scale of the inline surface mesh. + * + * @return The scale of the inline mesh + */ + UFUNCTION(BlueprintCallable, Category = "Portals") + FVector GetInlineScale() const; + + /** + * Iterates over the portal TMap and processes each item + */ + UFUNCTION(BlueprintCallable, Category = "Portals") + void IterateMap(); + + /** + * Sets the visibility of the dynamic mesh. + * + * @param bVisible Whether the mesh should be visible + */ + void SetMeshVisibility(bool bVisible); + +public: + /** + * Rebuilds the collision mesh + */ + void RebuildCollisionMesh(); + + /** + * Adds a portal to the TMap. + * + * @param Min The minimum vector of the portal domain + * @param Max The maximum vector of the portal domain + * @param Center The center point of the portal + * @param Rotation The rotation of the portal + * @return The ID of the added portal + */ + int32 AddPortal(const FVector& Min, const FVector& Max, const FVector& Center, const FRotator& Rotation); + + /** + * Gets a portal from the TMap. + * + * @param PortalID The ID of the portal to get + * @param Min The minimum vector of the portal domain (output) + * @param Max The maximum vector of the portal domain (output) + * @param Center The center point of the portal (output) + * @return true if the portal is found, false otherwise + */ + bool GetPortal(int32 PortalID, FVector& Min, FVector& Max, FVector& Center) const; + + /** + * Updates a portal in the TMap. + * + * @param PortalID The ID of the portal to update + * @param Min The new minimum vector of the portal domain + * @param Max The new maximum vector of the portal domain + * @param Center The new center point of the portal + * @return true if the portal is updated, false otherwise + */ + bool UpdatePortal(int32 PortalID, FVector Min, FVector Max, FVector Center); + + /** + * Removes a portal from the TMap. + * + * @param PortalID The ID of the portal to remove + * @return true if the portal is removed, false otherwise + */ + bool RemovePortal(int32 PortalID); + + /** + * Moves a portal if it overlaps with another portal. + * + * @param PortalID The ID of the portal to move + * @return true if the portal is moved, false otherwise + */ + bool MovePortalOnOverlap(int32 PortalID); + + /** + * Fits a portal to the surface. + * + * @param PortalID The ID of the portal to fit + * @param BoxMin The minimum vector of the bounding box + * @param BoxMax The maximum vector of the bounding box + */ + void FitPortalToSurface(int32 PortalID, const FVector BoxMin, const FVector BoxMax); +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalV3.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalV3.h new file mode 100644 index 0000000..b2cd994 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/PortalV3.h @@ -0,0 +1,168 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" + +#include "Components/SceneCaptureComponent2D.h" +#include "Engine/TextureRenderTarget2D.h" +#include "Components/BoxComponent.h" + +#include "PortalV3.generated.h" + +class USceneCaptureComponent2D; +class UTextureRenderTarget2D; +class UMaterialInstanceDynamic; +class UStaticMeshComponent; +class UPortalSurface; + +UCLASS() +class PORTAL2_API APortalV3 : public AActor +{ + GENERATED_BODY() + +public: + // Sets default values for this actor's properties + APortalV3(); + +public: + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + APortalV3* LinkedPortal; + + UPortalSurface* PortalSurface; + bool bIsOrangePortal; + +private: + UPROPERTY(VisibleAnywhere, Category = "G3NTs|Portal") + USceneCaptureComponent2D* SceneCapture; // essential + + UPROPERTY(VisibleAnywhere, Transient, Category = "G3NTs|Portal") + UTextureRenderTarget2D* PortalTexture; // essential + + UPROPERTY(VisibleAnywhere, Transient, Category = "G3NTs|Portal") + UTextureRenderTarget2D* PortalTexture2; // essential + + UPROPERTY(VisibleAnywhere, Category = "G3NTs|Portal") + UStaticMeshComponent* PortalMesh; // essential + + UPROPERTY(VisibleAnywhere, Transient, Category = "G3NTs|Portal") + UMaterialInstanceDynamic* DynamicMaterialInstance; // essential + + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + UMaterialInstance* Material; // essential + + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + FVector PortalEdgeColor; // essential + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Collision", meta = (AllowPrivateAccess = "true")) + UBoxComponent* BoxCheck; // essential + + FVector PortalScale = FVector(2.4, 1.2, 1.2); // essential + FRotator PortalRotation = FRotator(-90.f, 0.f, 0.f); // essential + FVector2D OldSize; // essential + bool bUsingPrimaryTextureTarget = true; // essential + int32 SurfaceId; // essential + +protected: + // Called when the game starts or when spawned + virtual void BeginPlay() override; + +private: + /** + * Deprecated! Debugs the collider used for teleportation checks by drawing a debug box in the world. + */ + void DebugCollider(); + + /** + * Resizes the static mesh to the defined portal scale. + */ + void ResizeStaticMesh(); /// worries me cause could have had a input param + + /** + * Draws a box in the world, ONLY when using the EDITOR. Used in combination with DebugCollider. + * + * @param World The world context. + * @param WorldOffset The offset of the box in the world. + * @param Color The color of the box. + * @param Duration The duration for which the box should be drawn. + */ + void DrawBox(UWorld* World, const FVector& WorldOffset, const FColor& Color, float Duration); + + /** + * Breaks a view projection matrix into its component vectors. + * Which is then used in the portal material instance to correctly calculate the screen space coordinates. + * + * @param InMatrix The input matrix to break. + * @param OutX The output X vector. + * @param OutY The output Y vector. + * @param OutZ The output Z vector. + * @param OutW The output W vector. + */ + bool BreakMatrix(const FMatrix& InMatrix, FVector4& OutX, FVector4& OutY, FVector4& OutZ, FVector4& OutW); + +public: + /** + * Updates the screen capture resources. + */ + void NullScreenCapture(); + + /** + * Destroys the portal and removes its link to the linked portal. + */ + void PortalDestroySelf(); + + /** + * Updates the screen capture with new parameters. + * + * @param Position The new position for the screen capture. + * @param Rotation The new rotation for the screen capture. + * @param ViewProjectionMatrix The new view projection matrix. + * @param Target The target portal transform. + * @param ProjectionMatrix The projection matrix. + */ + void UpdateScreenCapture(FVector Position, FQuat Rotation, FMatrix ViewProjectionMatrix, FTransform Target, FMatrix ProjectionMatrix); + + /** + * Updates the 2 texture targets. If the texture target objects do not yet exist, + * it creates them and sets their default values. If the texture target objects do exist, + * checks if the screen size changed, and if so updates the texture size. + * + * @param Size The new size for the texture target. + */ + void UpdateTextureTarget(FVector2D Size); + + /** + * Sets the surface data for the portal. The surface data, is a reference to the surface static mesh, + * which this portal is placed on. + * + * @param Index The index of the surface. + * @param PortalSurfaceData The surface data pointer. + */ + void SetSurfaceData(int32 Index, UPortalSurface* PortalSurfaceData); + + /** + * Sets the portal color edge color. + * + * @param ColorIn The new color for the portal edge. + */ + void SetPortalColor(FVector ColorIn); + + /** + * Gets the coordinates of the bounds of the portal. + * However, it discards one dimension as the portal plane is a "plane" not a box. + * + * @return An array of vectors representing the bounds of the portal. + */ + TArray GetPortalBounds(); + + /** + * Checks if a point is inside the portal collider box. + * In order to work with the possible rotations, normalizes the rotation and location to absolute local coordinates. + * + * @param Point The point to check. + * @return True if the point is inside the portal, false otherwise. + */ + bool IsInside(FVector Point); + +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/Public/TeleportAgent.h b/UE5/Cpp/G3NTs/Source/Portal2/Public/TeleportAgent.h new file mode 100644 index 0000000..b062cb7 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/Public/TeleportAgent.h @@ -0,0 +1,102 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/ActorComponent.h" +#include "TeleportAgent.generated.h" + +class APortal3Manager; +class UTP_WeaponComponent; + +UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) +class PORTAL2_API UTeleportAgent : public UActorComponent +{ + GENERATED_BODY() + +public: + // Sets default values for this component's properties + UTeleportAgent(); + +private: + UPROPERTY(VisibleAnywhere, Category = "G3NTs|Portal") + TMap TeleportStatus; + + /** Dynamic material instances used for the clipping plane effect */ + UPROPERTY(VisibleAnywhere, Category = "G3NTs|Portal") + TArray DynamicMaterialInstances; + + /** Material interface used by the actor */ + UPROPERTY(VisibleAnywhere, Category = "G3NTs|Portal") + UMaterialInterface* MaterialInterface; + +public: + /** Flag indicating if the actor is controlled by a player */ + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + bool bIsPlayerController; + + /** Flag indicating if the actor is a cloned entity */ + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + bool bIsCloned; + + /** Flag indicating if the actor should not be teleported */ + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + bool bDoNotTeleport; + + /** Flag indicating if the actor is attached to another actor */ + UPROPERTY(EditAnywhere, Category = "G3NTs|Portal") + bool bIsAttached; + + /** The collision profile name before any changes were made */ + FName CollisionProfileName; + +protected: + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + +public: + /** + * Sets the teleportation status for a given actor + * + * @param Actor The actor whose teleport status is being set + * @param bCanTeleport The new teleport status + */ + UFUNCTION(BlueprintCallable, Category = "G3NTs|Portal") + void SetTeleportStatus(AActor* Actor, bool bCanTeleport); + + /** + * Sets the clipping plane with a specified location and forward vector + * + * @param InLocation The location to set the clip plane + * @param InForwardVector The forward vector for the clip plane + */ + UFUNCTION(BlueprintCallable, Category = "G3NTs|Portal") + void SetClipPlane(FVector InLocation, FVector InForwardVector); + + /** + * Disables the clipping plane + */ + UFUNCTION(BlueprintCallable, Category = "G3NTs|Portal") + void DisableClipPlane(); + + /** + * Gets the teleportation status for a given actor + * + * @param Actor The actor whose teleport status is being queried + * @return The teleport status of the actor + */ + UFUNCTION(BlueprintCallable, Category = "G3NTs|Portal") + bool GetTeleportStatus(AActor* Actor); + + /** + * Changes the collision settings for the agent + * + * @param bCollisionEnabled Whether to enable or disable collision + */ + void ChangeAgentCollision(bool bCollisionEnabled); + + /** + * Resets the collision settings for the agent to the original settings + */ + void ResetAgentCollision(); +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2/TP_PickUpComponent.cpp b/UE5/Cpp/G3NTs/Source/Portal2/TP_PickUpComponent.cpp new file mode 100644 index 0000000..d0ccf06 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/TP_PickUpComponent.cpp @@ -0,0 +1,32 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "TP_PickUpComponent.h" + +UTP_PickUpComponent::UTP_PickUpComponent() +{ + // Setup the Sphere Collision + SphereRadius = 32.f; + +} + +void UTP_PickUpComponent::BeginPlay() +{ + Super::BeginPlay(); + + // Register our Overlap Event + OnComponentBeginOverlap.AddDynamic(this, &UTP_PickUpComponent::OnSphereBeginOverlap); +} + +void UTP_PickUpComponent::OnSphereBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + // Checking if it is a First Person Character overlapping + APortal2Character* Character = Cast(OtherActor); + if(Character != nullptr) + { + // Notify that the actor is being picked up + OnPickUp.Broadcast(Character); + + // Unregister from the Overlap Event so it is no longer triggered + OnComponentBeginOverlap.RemoveAll(this); + } +} diff --git a/UE5/Cpp/G3NTs/Source/Portal2/TP_PickUpComponent.h b/UE5/Cpp/G3NTs/Source/Portal2/TP_PickUpComponent.h new file mode 100644 index 0000000..6961f8c --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/TP_PickUpComponent.h @@ -0,0 +1,34 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/SphereComponent.h" +#include "Portal2Character.h" +#include "TP_PickUpComponent.generated.h" + +// Declaration of the delegate that will be called when someone picks this up +// The character picking this up is the parameter sent with the notification +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPickUp, APortal2Character*, PickUpCharacter); + +UCLASS(Blueprintable, BlueprintType, ClassGroup = (Custom), meta = (BlueprintSpawnableComponent)) +class PORTAL2_API UTP_PickUpComponent : public USphereComponent +{ + GENERATED_BODY() + +public: + + /** Delegate to whom anyone can subscribe to receive this event */ + UPROPERTY(BlueprintAssignable, Category = "Interaction") + FOnPickUp OnPickUp; + + UTP_PickUpComponent(); +protected: + + /** Called when the game starts */ + virtual void BeginPlay() override; + + /** Code for when something overlaps this component */ + UFUNCTION() + void OnSphereBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); +}; \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/TP_WeaponComponent.cpp b/UE5/Cpp/G3NTs/Source/Portal2/TP_WeaponComponent.cpp new file mode 100644 index 0000000..040b812 --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/TP_WeaponComponent.cpp @@ -0,0 +1,264 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "TP_WeaponComponent.h" +#include "Portal2Character.h" +#include "Portal2Projectile.h" +#include "GameFramework/PlayerController.h" +#include "Camera/PlayerCameraManager.h" +#include "Kismet/GameplayStatics.h" +#include "EnhancedInputComponent.h" +#include "EnhancedInputSubsystems.h" +#include "Animation/AnimInstance.h" +#include "GameFramework/Controller.h" +#include "Engine/LocalPlayer.h" +#include "MyAnimInstance.h" +#include "PortalBullet.h" +#include "Engine/World.h" + +// Sets default values for this component's properties +UTP_WeaponComponent::UTP_WeaponComponent() +{ + PrimaryComponentTick.bCanEverTick = true; + PrimaryComponentTick.TickGroup = TG_PostUpdateWork; + // Default offset from the character location for projectiles to spawn + MuzzleOffset = FVector(25.0f, 10.0f, -10.0f); +} + +void UTP_WeaponComponent::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if (Character == nullptr) + { + return; + } + + if (APlayerController* PlayerController = Cast(Character->GetController())) + { + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(PlayerController->GetLocalPlayer())) + { + Subsystem->RemoveMappingContext(FireMappingContext); + } + } +} + +void UTP_WeaponComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) +{ + Super::TickComponent(DeltaTime, TickType, ThisTickFunction); + if (bFireReady) + { + if (Timer >= 1) + { + // the fire animation is delayed one frame, so that the clone and main actor can start simultaniously. + PlayFireAnimation(false); + } + Timer++; + } + else + { + Timer = 0; + } +} + +/** + * Make the weapon Fire a Projectile + */ +void UTP_WeaponComponent::Fire() +{ + if (Character == nullptr || Character->GetController() == nullptr) + { + return; + } + + // Try and fire a projectile + if (ProjectileClass != nullptr) + { + UWorld* const World = GetWorld(); + if (World != nullptr) + { + APlayerController* PlayerController = Cast(Character->GetController()); + const FRotator SpawnRotation = PlayerController->PlayerCameraManager->GetCameraRotation(); + // MuzzleOffset is in camera space, so transform it to world space before offsetting from the character location to find the final muzzle position + const FVector SpawnLocation = PlayerController->PlayerCameraManager->GetCameraLocation() + SpawnRotation.RotateVector(MuzzleOffset); + + //Set Spawn Collision Handling Override + FActorSpawnParameters ActorSpawnParams; + ActorSpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding; + + // Spawn the projectile at the muzzle + World->SpawnActor(ProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams); + } + } + + // Try and play the sound if specified + if (FireSound != nullptr) + { + UGameplayStatics::PlaySoundAtLocation(this, FireSound, Character->GetActorLocation()); + } + + PlayFireAnimation(true); +} + +/** + * Plays the fire animation + * + * @param bIn Boolean indicating whether to play the animation + */ +void UTP_WeaponComponent::PlayFireAnimation(bool bIn) +{ + // Try and play a firing animation if specified + if (FireAnimation != nullptr) + { + // Get the animation object for the arms mesh + UAnimInstance* AnimInstance = Character->GetMesh1P()->GetAnimInstance(); + if (AnimInstance != nullptr) + { + UMyAnimInstance* AnimInstanceCast = Cast(AnimInstance); + AnimInstanceCast->bFire = bIn; + + if (!bIn) + { + AnimInstance->Montage_Play(FireAnimation, 1.f); + AnimInstanceCast->bFire = bIn; + bFireReady = bIn; + } + else + { + bFireReady = bIn; + } + } + } +} + +/** + * Fires a blue portal + */ +void UTP_WeaponComponent::FireBluePortal() +{ + FirePortal(false); +} + +/** + * Fires an orange portal + */ +void UTP_WeaponComponent::FireOrangePortal() +{ + FirePortal(true); +} + +/** + * Fires a portal based on the color specified + * + * @param bIsRed Boolean indicating whether to fire a red (orange) portal + */ +void UTP_WeaponComponent::FirePortal(bool bIsOrange) +{ + APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0); + APlayerCameraManager* CameraManager = PlayerController->PlayerCameraManager; + + FVector SpawnLocation = CameraManager->GetCameraLocation() + CameraManager->GetCameraRotation().RotateVector(FVector(60.f,0.f,-10.f)); // Offset from the camera + FActorSpawnParameters SpawnParams; + SpawnParams.Owner = GetOwner(); + + AActor* PortalBullet; + + if (bIsOrange) + { + PortalBullet = GetWorld()->SpawnActor(ABP_PortalBullet_Orange, SpawnLocation, CameraManager->GetCameraRotation(), SpawnParams); + UE_LOG(LogTemp, Warning, TEXT("Orange")); + } + else + { + PortalBullet = GetWorld()->SpawnActor(ABP_PortalBullet_Blue, SpawnLocation, CameraManager->GetCameraRotation(), SpawnParams); + UE_LOG(LogTemp, Warning, TEXT("Blue")); + } + + + if (APortalBullet* PortalCast = Cast(PortalBullet)) + { + PortalCast->bIsOrangePortal = bIsOrange; + } + + if (FireSound != nullptr) + { + UGameplayStatics::PlaySoundAtLocation(this, FireSound, Character->GetActorLocation()); + } + + PlayFireAnimation(true); +} + +/** + * Changes the gun mode between portal mode and projectile mode + */ +void UTP_WeaponComponent::ChangeGunMode() +{ + CurrentGunMode = (CurrentGunMode == EGunMode::Projectile_Mode) ? EGunMode::Portal_Mode : EGunMode::Projectile_Mode; + + if (APlayerController* PlayerController = Cast(Character->GetController())) + { + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(PlayerController->GetLocalPlayer())) + { + // Set the priority of the mapping to 1, so that it overrides the Jump action with the Fire action when using touch input + Subsystem->AddMappingContext(FireMappingContext, 1); + } + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerController->InputComponent)) + { + // Unbind all existing actions first + EnhancedInputComponent->ClearActionBindings(); + + // Bind actions based on the current gun mode + if (CurrentGunMode == EGunMode::Projectile_Mode) + { + EnhancedInputComponent->BindAction(LeftFireAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::Fire); + EnhancedInputComponent->BindAction(GunModeAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::ChangeGunMode); + } + else if (CurrentGunMode == EGunMode::Portal_Mode) + { + EnhancedInputComponent->BindAction(LeftFireAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::FireBluePortal); + EnhancedInputComponent->BindAction(RightFireAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::FireOrangePortal); + EnhancedInputComponent->BindAction(GunModeAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::ChangeGunMode); + } + } + } +} + +/** + * Attaches the weapon to a character + * + * @param TargetCharacter The character to attach the weapon to + * @return True if the weapon was successfully attached, false otherwise + */ +bool UTP_WeaponComponent::AttachWeapon(APortal2Character* TargetCharacter) +{ + Character = TargetCharacter; + + // Check that the character is valid, and has no weapon component yet + if (Character == nullptr || Character->GetInstanceComponents().FindItemByClass()) + { + return false; + } + + // Attach the weapon to the First Person Character + FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, true); + AttachToComponent(Character->GetMesh1P(), AttachmentRules, FName(TEXT("GripPoint"))); + + // add the weapon as an instance component to the character + Character->AddInstanceComponent(this); + + // Set up action bindings + if (APlayerController* PlayerController = Cast(Character->GetController())) + { + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(PlayerController->GetLocalPlayer())) + { + // Set the priority of the mapping to 1, so that it overrides the Jump action with the Fire action when using touch input + Subsystem->AddMappingContext(FireMappingContext, 1); + } + + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerController->InputComponent)) + { + // Fire + EnhancedInputComponent->BindAction(LeftFireAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::Fire); + EnhancedInputComponent->BindAction(GunModeAction, ETriggerEvent::Triggered, this, &UTP_WeaponComponent::ChangeGunMode); + } + } + + return true; +} \ No newline at end of file diff --git a/UE5/Cpp/G3NTs/Source/Portal2/TP_WeaponComponent.h b/UE5/Cpp/G3NTs/Source/Portal2/TP_WeaponComponent.h new file mode 100644 index 0000000..6ab1a8c --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2/TP_WeaponComponent.h @@ -0,0 +1,142 @@ +// Copyright Epic Games, Inc. All Rights Reserved. +// Modified version of the Epic Games weapon class. + +#pragma once + +#include "CoreMinimal.h" +#include "Components/SkeletalMeshComponent.h" +#include "TP_WeaponComponent.generated.h" + +class APortal2Character; + +/** + * Enum to represent the different gun modes + */ +UENUM(BlueprintType) +enum class EGunMode : uint8 +{ + Projectile_Mode, + Portal_Mode +}; + +/** + * UTP_WeaponComponent is a component that handles weapon functionalities such as firing projectiles or portals and changing gun modes. + */ +UCLASS(Blueprintable, BlueprintType, ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) ) +class PORTAL2_API UTP_WeaponComponent : public USkeletalMeshComponent +{ + GENERATED_BODY() + +public: + /** Sets default values for this component's properties */ + UTP_WeaponComponent(); + +private: + /** The Character holding this weapon*/ + APortal2Character* Character; + + /** The current gun mode */ + EGunMode CurrentGunMode; + + /** Boolean indicating whether the weapon is ready to fire */ + bool bFireReady; + + /** Timer for handling firing rate */ + int Timer = 0; + +public: + /** Projectile class to spawn */ + UPROPERTY(EditDefaultsOnly, Category=Projectile) + TSubclassOf ProjectileClass; + + /** Sound to play each time we fire */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Gameplay) + USoundBase* FireSound; + + /** AnimMontage to play each time we fire */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay) + UAnimMontage* FireAnimation; + + /** Gun muzzle's offset from the characters location */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Gameplay) + FVector MuzzleOffset; + + /** MappingContext */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) + class UInputMappingContext* FireMappingContext; + + /** Fire Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Input, meta=(AllowPrivateAccess = "true")) + class UInputAction* LeftFireAction; + + /** Fire Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) + class UInputAction* RightFireAction; + + /** Fire Input Action */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input, meta = (AllowPrivateAccess = "true")) + class UInputAction* GunModeAction; + + /** Blue portal bullet class reference */ + UPROPERTY(EditAnywhere) + TSubclassOf ABP_PortalBullet_Blue; + + /** Orange portal bullet class reference */ + UPROPERTY(EditAnywhere) + TSubclassOf ABP_PortalBullet_Orange; + +protected: + virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + +public: + /** + * Attaches the weapon to a character + * + * @param TargetCharacter The character to attach the weapon to + * @return True if the weapon was successfully attached, false otherwise + */ + UFUNCTION(BlueprintCallable, Category="Weapon") + bool AttachWeapon(APortal2Character* TargetCharacter); + + /** + * Make the weapon Fire a Projectile + */ + UFUNCTION(BlueprintCallable, Category="Weapon") + void Fire(); + + /** + * Plays the fire animation + * + * @param bIn Boolean indicating whether to play the animation + */ + UFUNCTION(BlueprintCallable, Category = "Weapon") + void PlayFireAnimation(bool bIn); + + /** + * Fires a blue portal + */ + UFUNCTION(BlueprintCallable, Category = "Weapon") + void FireBluePortal(); + + /** + * Fires an orange portal + */ + UFUNCTION(BlueprintCallable, Category = "Weapon") + void FireOrangePortal(); + + /** + * Fires a portal based on the color specified + * + * @param bIsRed Boolean indicating whether to fire a red (orange) portal + */ + UFUNCTION(BlueprintCallable, Category = "Weapon") + void FirePortal(bool bIsRed); + + /** + * Changes the gun mode between portal mode and projectile mode + */ + UFUNCTION(BlueprintCallable, Category = "Weapon") + void ChangeGunMode(); + +}; diff --git a/UE5/Cpp/G3NTs/Source/Portal2Editor.Target.cs b/UE5/Cpp/G3NTs/Source/Portal2Editor.Target.cs new file mode 100644 index 0000000..c02490c --- /dev/null +++ b/UE5/Cpp/G3NTs/Source/Portal2Editor.Target.cs @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; +using System.Collections.Generic; + +public class Portal2EditorTarget : TargetRules +{ + public Portal2EditorTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Editor; + DefaultBuildSettings = BuildSettingsVersion.V5; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_4; + ExtraModuleNames.Add("Portal2"); + } +} diff --git a/UE5/Cpp/G3NTs/portal.gif b/UE5/Cpp/G3NTs/portal.gif new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/UE5/Cpp/G3NTs/portal.gif @@ -0,0 +1 @@ + diff --git a/UE5/Cpp/G3NTs/shadertoolsconfig.json b/UE5/Cpp/G3NTs/shadertoolsconfig.json new file mode 100644 index 0000000..9e8ecb4 --- /dev/null +++ b/UE5/Cpp/G3NTs/shadertoolsconfig.json @@ -0,0 +1,8 @@ +{ + "hlsl.preprocessorDefinitions": { + }, + " hlsl.additionalIncludeDirectories": [ + ], + "hlsl.virtualDirectoryMappings": { + } +}