diff --git a/.gitignore b/.gitignore
index 8fa8a52..0f23bc3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,5 @@ Project/.idea
Project/Saved/Screenshots
*/Binaries/Win64/*.patch_*.*
+Project/Saved/ImGui
+Project/Saved/ImGui/imgui.ini
diff --git a/Project/Binaries/Win64/UnrealEditor-Gasa.dll b/Project/Binaries/Win64/UnrealEditor-Gasa.dll
index 7ad2072..e0d6a05 100644
Binary files a/Project/Binaries/Win64/UnrealEditor-Gasa.dll and b/Project/Binaries/Win64/UnrealEditor-Gasa.dll differ
diff --git a/Project/Binaries/Win64/UnrealEditor-Gasa.pdb b/Project/Binaries/Win64/UnrealEditor-Gasa.pdb
index a127970..fb25b60 100644
Binary files a/Project/Binaries/Win64/UnrealEditor-Gasa.pdb and b/Project/Binaries/Win64/UnrealEditor-Gasa.pdb differ
diff --git a/Project/Config/DefaultEngine.ini b/Project/Config/DefaultEngine.ini
index fb93593..0159339 100644
--- a/Project/Config/DefaultEngine.ini
+++ b/Project/Config/DefaultEngine.ini
@@ -58,6 +58,7 @@ bAuthorizeAutomaticWidgetVariableCreation=False
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="TP_BlankBP",NewGameName="/Script/Aura")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_BlankBP",NewGameName="/Script/Aura")
+LevelScriptActorClassName=/Script/Gasa.GasaLevelScriptActor
[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
bEnablePlugin=True
@@ -73,3 +74,59 @@ ConnectionType=USBOnly
bUseManualIPAddress=False
ManualIPAddress=
+[/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. ")
+-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")
+
diff --git a/Project/Config/DefaultGame.ini b/Project/Config/DefaultGame.ini
index 01d0e30..4e58ee5 100644
--- a/Project/Config/DefaultGame.ini
+++ b/Project/Config/DefaultGame.ini
@@ -6,3 +6,7 @@ Description=GASATHON
ProjectName=GASATHON
CopyrightNotice=
+[/Script/Gasa.GasaDevOptions]
+Tag_PPV=Global_PPV
+Tag_GlobalPPV=Global_PPV
+
diff --git a/Project/Gasa.sln.DotSettings.user b/Project/Gasa.sln.DotSettings.user
index 937060c..293c066 100644
--- a/Project/Gasa.sln.DotSettings.user
+++ b/Project/Gasa.sln.DotSettings.user
@@ -1,2 +1,3 @@
- Override
\ No newline at end of file
+ Override
+ True
\ No newline at end of file
diff --git a/Project/Saved/ImGui/imgui.ini b/Project/Saved/ImGui/imgui.ini
deleted file mode 100644
index f366cf0..0000000
--- a/Project/Saved/ImGui/imgui.ini
+++ /dev/null
@@ -1,29 +0,0 @@
-[Window][DockSpaceViewport_11111111]
-Pos=0,0
-Size=1614,1271
-Collapsed=0
-
-[Window][Debug##Default]
-Pos=60,60
-Size=400,400
-Collapsed=0
-
-[Window][Inspector##Inspector]
-Pos=910,136
-Size=641,1061
-Collapsed=1
-
-[Table][0x7E0CA29E,2]
-Column 0 Weight=1.0000
-Column 1 Weight=1.0000
-
-[Docking][Data]
-DockSpace ID=0x8B93E3BD Window=0xA787BDB4 Pos=0,0 Size=1614,1271 CentralNode=1
-
-[Cog][Windows]
-0xD0F6B9F9
-
-[Cog][Widgets]
-0x348EE4A5 0
-0x63A19979 0
-
diff --git a/Project/Source/Gasa/Actors/CameraMount.cpp b/Project/Source/Gasa/Actors/CameraMount.cpp
new file mode 100644
index 0000000..6987fc3
--- /dev/null
+++ b/Project/Source/Gasa/Actors/CameraMount.cpp
@@ -0,0 +1,30 @@
+#include "CameraMount.h"
+
+#include "Camera/CameraComponent.h"
+#include "GameFramework/SpringArmComponent.h"
+
+
+ACameraMount::ACameraMount()
+{
+ PrimaryActorTick.bCanEverTick = true;
+
+ RootComponent = CreateDefaultSubobject("Root");
+
+ CamSpringArm = CreateDefaultSubobject("Camera Spring Arm");
+ CamSpringArm->SetupAttachment(RootComponent);
+ CamSpringArm->SetRelativeRotation( FQuat::MakeFromEuler(FVector(0.0, -35.0, 0.0)));
+ CamSpringArm->TargetArmLength = 400.0f;
+ CamSpringArm->bDoCollisionTest = true;
+
+ CamSpringArm->bInheritPitch = false;
+ CamSpringArm->bInheritYaw = false;
+ CamSpringArm->bInheritRoll = false;
+
+ Camera = CreateDefaultSubobject("Camera");
+ Camera->SetupAttachment(CamSpringArm);
+}
+
+void ACameraMount::PostInitializeComponents()
+{
+ Super::PostInitializeComponents();
+}
diff --git a/Project/Source/Gasa/Actors/CameraMount.h b/Project/Source/Gasa/Actors/CameraMount.h
new file mode 100644
index 0000000..c099aeb
--- /dev/null
+++ b/Project/Source/Gasa/Actors/CameraMount.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "GasaCommon.h"
+#include "CameraMount.generated.h"
+
+UCLASS(Blueprintable)
+class GASA_API ACameraMount : public AActor
+{
+ GENERATED_BODY()
+public:
+#pragma region Camera
+ UPROPERTY(EditAnywhere, Category="Camera")
+ TObjectPtr Camera;
+
+ UPROPERTY(EditAnywhere, Category="Camera")
+ TObjectPtr CamSpringArm;
+#pragma endregion Camera
+
+ ACameraMount();
+
+#pragma region Actor
+ void PostInitializeComponents() override;
+#pragma endregion Actor
+};
+
diff --git a/Project/Source/Gasa/Character/EnemyCharacter.cpp b/Project/Source/Gasa/Characters/EnemyCharacter.cpp
similarity index 100%
rename from Project/Source/Gasa/Character/EnemyCharacter.cpp
rename to Project/Source/Gasa/Characters/EnemyCharacter.cpp
diff --git a/Project/Source/Gasa/Character/EnemyCharacter.h b/Project/Source/Gasa/Characters/EnemyCharacter.h
similarity index 100%
rename from Project/Source/Gasa/Character/EnemyCharacter.h
rename to Project/Source/Gasa/Characters/EnemyCharacter.h
diff --git a/Project/Source/Gasa/Character/GasaCharacter.cpp b/Project/Source/Gasa/Characters/GasaCharacter.cpp
similarity index 67%
rename from Project/Source/Gasa/Character/GasaCharacter.cpp
rename to Project/Source/Gasa/Characters/GasaCharacter.cpp
index f1edd86..b604efb 100644
--- a/Project/Source/Gasa/Character/GasaCharacter.cpp
+++ b/Project/Source/Gasa/Characters/GasaCharacter.cpp
@@ -1,5 +1,6 @@
#include "GasaCharacter.h"
+#include "GasaLevelScriptActor.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
@@ -31,18 +32,6 @@ AGasaCharacter::AGasaCharacter()
USceneComponent* root_component = GetRootComponent();
USkeletalMeshComponent* mesh = GetMesh();
- CamSpringArm = CreateDefaultSubobject("Camera Spring Arm");
- CamSpringArm->SetupAttachment(root_component);
- CamSpringArm->SetRelativeRotation( FQuat::MakeFromEuler(FVector(0.0, -35.0, 0.0)));
- CamSpringArm->TargetArmLength = 400.0f;
-
- CamSpringArm->bInheritPitch = false;
- CamSpringArm->bInheritYaw = false;
- CamSpringArm->bInheritRoll = false;
-
- Camera = CreateDefaultSubobject("Camera");
- Camera->SetupAttachment(CamSpringArm);
-
Weapon = CreateDefaultSubobject("Weapon");
Weapon->SetupAttachment(mesh, FName("WeaponAttach"));
Weapon->SetCollisionEnabled(ECollisionEnabled::NoCollision);
@@ -56,24 +45,42 @@ void AGasaCharacter::BeginPlay()
void AGasaCharacter::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
-
+
+ USkeletalMeshComponent* mesh = GetMesh();
switch (HighlightState)
{
case EHighlight::Disabled:
+ {
+ mesh->SetRenderCustomDepth(false);
+ mesh->SetCustomDepthStencilValue(0.f);
+ Weapon->SetRenderCustomDepth(false);
+ Weapon->SetCustomDepthStencilValue(0.f);
+ }
break;
case EHighlight::Enabled:
{
+ mesh->SetRenderCustomDepth(true);
+ mesh->SetCustomDepthStencilValue(HighlightStencilDepth);
+ Weapon->SetRenderCustomDepth(true);
+ Weapon->SetCustomDepthStencilValue(HighlightStencilDepth);
+
+ APostProcessVolume* PPV = Gasa::GetLevelActor(this)->GlobalPPV;
+ TObjectPtr Blendable = PPV->Settings.WeightedBlendables.Array[0].Object;
+ UMaterialInstanceDynamic*
+ MID = Cast(Blendable);
+ MID->SetVectorParameterValue("Depth Highlight Color", HighlightColor);
+#if 0
UCapsuleComponent* Capsule = GetCapsuleComponent();
-
UKismetSystemLibrary::DrawDebugCapsule(this
, Capsule->GetComponentLocation()
- , Capsule->GetScaledCapsuleHalfHeight()
+ , Capsule->GetScaledCapsuleHalfHeight()^
, Capsule->GetScaledCapsuleRadius()
, Capsule->GetComponentRotation()
, HighlightColor
, 0.f
, 1.f
);
+#endif
}
break;
}
diff --git a/Project/Source/Gasa/Character/GasaCharacter.h b/Project/Source/Gasa/Characters/GasaCharacter.h
similarity index 71%
rename from Project/Source/Gasa/Character/GasaCharacter.h
rename to Project/Source/Gasa/Characters/GasaCharacter.h
index 1ce5ca1..2ba125f 100644
--- a/Project/Source/Gasa/Character/GasaCharacter.h
+++ b/Project/Source/Gasa/Characters/GasaCharacter.h
@@ -17,23 +17,14 @@ class GASA_API AGasaCharacter : public ACharacter
{
GENERATED_BODY()
public:
- // TODO(Ed): Either make a toggle ore move to player controller if it gets expensive
- // There is no need to have this lodged int PlayerCharacter anyway. It can attach to pawn on posses.
-#pragma region Camera
- UPROPERTY(EditAnywhere, Category="Camera")
- UCameraComponent* Camera;
-
- UPROPERTY(EditAnywhere, Category="Camera")
- USpringArmComponent* CamSpringArm;
-#pragma endregion Camera
-
#pragma region Combat
UPROPERTY(EditAnywhere, Category="Combat")
TObjectPtr Weapon;
#pragma endregion Combat
- // This will be implemented in the base until it needs to be lifted into an abstraction.
#pragma region Highlighting
+ static constexpr float HighlightStencilDepth = 256.0;
+
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Highlighting")
EHighlight HighlightState;
@@ -49,7 +40,7 @@ public:
UFUNCTION(BlueprintCallable, Category="Highlighting")
FORCEINLINE void Dehighlight() { SetHighlight(EHighlight::Disabled); };
#pragma endregion Highlighting
-
+
AGasaCharacter();
#pragma region Actor
diff --git a/Project/Source/Gasa/Character/PlayerCharacter.cpp b/Project/Source/Gasa/Characters/PlayerCharacter.cpp
similarity index 100%
rename from Project/Source/Gasa/Character/PlayerCharacter.cpp
rename to Project/Source/Gasa/Characters/PlayerCharacter.cpp
diff --git a/Project/Source/Gasa/Character/PlayerCharacter.h b/Project/Source/Gasa/Characters/PlayerCharacter.h
similarity index 100%
rename from Project/Source/Gasa/Character/PlayerCharacter.h
rename to Project/Source/Gasa/Characters/PlayerCharacter.h
diff --git a/Project/Source/Gasa/Gasa.Build.cs b/Project/Source/Gasa/Gasa.Build.cs
index 8a24d65..f625232 100644
--- a/Project/Source/Gasa/Gasa.Build.cs
+++ b/Project/Source/Gasa/Gasa.Build.cs
@@ -23,6 +23,7 @@ public class Gasa : ModuleRules
"AIModule",
"CoreUObject",
+ "DeveloperSettings",
"Engine",
"EnhancedInput",
"GameplayAbilities",
diff --git a/Project/Source/Gasa/GasaCommon.h b/Project/Source/Gasa/GasaCommon.h
index 5083ae5..c08a2e4 100644
--- a/Project/Source/Gasa/GasaCommon.h
+++ b/Project/Source/Gasa/GasaCommon.h
@@ -1,22 +1,32 @@
+#pragma once
+
#include "CoreMinimal.h"
// #define private protected
-#include "CogCommon.h"
+#define global
+#define internal static
+#define local_persist static
#pragma region Engine Forwards
-class UCameraComponent;
-class UInputAction;
struct FInputActionValue;
-class UInputMappingContext;
-class USpringArmComponent;
+
+class UCameraComponent;
+class UInputAction;
+class UInputMappingContext;
+class USpringArmComponent;
#pragma endregion Engine Forwards
#pragma region Engine Plugin Forwards
class UCogWindowManager;
#pragma endregion Engine Plugin Forwards
-#pragma region Gasa Forwards
-class AGasaCharacter;
-#pragma endregion Gasa Forwards
+// Gasa
+#pragma region Forwards
+class ACameraMount;
+class AGasaCharacter;
+class AGasaLevelScriptActor;
+
+class UGasaDevOptions;
+#pragma endregion Forwards
diff --git a/Project/Source/Gasa/GasaDevOptions.cpp b/Project/Source/Gasa/GasaDevOptions.cpp
new file mode 100644
index 0000000..d5b0bad
--- /dev/null
+++ b/Project/Source/Gasa/GasaDevOptions.cpp
@@ -0,0 +1,18 @@
+#include "GasaDevOptions.h"
+
+#include "GasaDevOptionsCache.h"
+
+namespace Gasa
+{
+ global FName Tag_GlobalPPV;
+}
+
+void FGasaDevOptionsCache::CachedDevOptions()
+{
+ using namespace Gasa;
+
+ UGasaDevOptions const* DevOs = GetDevOptions();
+ Tag_GlobalPPV = DevOs->Tag_GlobalPPV;
+}
+
+
\ No newline at end of file
diff --git a/Project/Source/Gasa/GasaDevOptions.h b/Project/Source/Gasa/GasaDevOptions.h
new file mode 100644
index 0000000..3a43e00
--- /dev/null
+++ b/Project/Source/Gasa/GasaDevOptions.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "Engine/DeveloperSettings.h"
+
+#include "GasaDevOptions.generated.h"
+
+UCLASS(Config=Game, DefaultConfig, meta=(DisplayName="Gasa"))
+class GASA_API UGasaDevOptions : public UDeveloperSettings
+{
+ GENERATED_BODY()
+public:
+ UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="Tags")
+ FName Tag_GlobalPPV;
+};
+
+namespace Gasa
+{
+ extern FName Tag_GlobalPPV;
+
+ FORCEINLINE
+ UGasaDevOptions const* GetDevOptions() {
+ return GetDefault();
+ }
+
+ FORCEINLINE
+ UGasaDevOptions* GetMutDevOptions() {
+ return GetMutableDefault();
+ }
+}
diff --git a/Project/Source/Gasa/GasaDevOptionsCache.h b/Project/Source/Gasa/GasaDevOptionsCache.h
new file mode 100644
index 0000000..3726b37
--- /dev/null
+++ b/Project/Source/Gasa/GasaDevOptionsCache.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "GasaCommon.h"
+
+#include "GasaDevOptionsCache.generated.h"
+
+USTRUCT()
+struct GASA_API FGasaDevOptionsCache
+{
+ GENERATED_BODY()
+
+ void CachedDevOptions();
+};
diff --git a/Project/Source/Gasa/GasaGameInstance.cpp b/Project/Source/Gasa/GasaGameInstance.cpp
new file mode 100644
index 0000000..f6f529a
--- /dev/null
+++ b/Project/Source/Gasa/GasaGameInstance.cpp
@@ -0,0 +1,8 @@
+#include "GasaGameInstance.h"
+
+void UGasaGameInstance::Init()
+{
+ Super::Init();
+
+ DevOptionsCache.CachedDevOptions();
+}
diff --git a/Project/Source/Gasa/GasaGameInstance.h b/Project/Source/Gasa/GasaGameInstance.h
new file mode 100644
index 0000000..e189314
--- /dev/null
+++ b/Project/Source/Gasa/GasaGameInstance.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "GasaCommon.h"
+#include "GasaDevOptionsCache.h"
+
+#include "GasaGameInstance.generated.h"
+
+UCLASS(Blueprintable)
+class GASA_API UGasaGameInstance : public UGameInstance
+{
+ GENERATED_BODY()
+public:
+
+ UPROPERTY(VisibleAnywhere, Category="Dev Cache")
+ FGasaDevOptionsCache DevOptionsCache;
+
+#pragma region GameInstance
+ void Init() override;
+#pragma endregion GameInstance
+};
+
+namespace Gasa
+{
+ FORCEINLINE
+ UGasaGameInstance* GetGameInstance(UObject* Context) {
+ // TODO(Ed): Do this with proper checks
+ return Context->GetWorld()->GetGameInstance();
+ }
+}
\ No newline at end of file
diff --git a/Project/Source/Gasa/GasaGameMode.h b/Project/Source/Gasa/GasaGameMode.h
index 7fa00d4..a443e6e 100644
--- a/Project/Source/Gasa/GasaGameMode.h
+++ b/Project/Source/Gasa/GasaGameMode.h
@@ -9,3 +9,11 @@ class GASA_API AGasaGameMode : public AGameMode
GENERATED_BODY()
public:
};
+
+namespace Gasa
+{
+ FORCEINLINE
+ AGasaGameMode* GetGameMode(UObject* Context) {
+ return Context->GetWorld()->GetAuthGameMode();
+ }
+}
\ No newline at end of file
diff --git a/Project/Source/Gasa/GasaGameState.h b/Project/Source/Gasa/GasaGameState.h
index 2322878..ddd9691 100644
--- a/Project/Source/Gasa/GasaGameState.h
+++ b/Project/Source/Gasa/GasaGameState.h
@@ -27,4 +27,12 @@ public:
void Tick(float DeltaSeconds) override;
#pragma endregion GameState
-};
\ No newline at end of file
+};
+
+namespace Gasa
+{
+ FORCEINLINE
+ AGasaGameState* GetGameState(UObject* Context) {
+ return Context->GetWorld()->GetGameState();
+ }
+}
diff --git a/Project/Source/Gasa/GasaGameplayTags.cpp b/Project/Source/Gasa/GasaGameplayTags.cpp
new file mode 100644
index 0000000..1cfb1e5
--- /dev/null
+++ b/Project/Source/Gasa/GasaGameplayTags.cpp
@@ -0,0 +1,2 @@
+#include "GasaGameplayTags.h"
+
diff --git a/Project/Source/Gasa/GasaGameplayTags.h b/Project/Source/Gasa/GasaGameplayTags.h
new file mode 100644
index 0000000..7c4e84d
--- /dev/null
+++ b/Project/Source/Gasa/GasaGameplayTags.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#include "NativeGameplayTags.h"
\ No newline at end of file
diff --git a/Project/Source/Gasa/GasaLevelScriptActor.cpp b/Project/Source/Gasa/GasaLevelScriptActor.cpp
new file mode 100644
index 0000000..8a08cc9
--- /dev/null
+++ b/Project/Source/Gasa/GasaLevelScriptActor.cpp
@@ -0,0 +1,25 @@
+#include "GasaLevelScriptActor.h"
+
+#include "GasaDevOptions.h"
+#include "GasaGameplayTags.h"
+#include "Kismet/GameplayStatics.h"
+
+#include "GasaLibrary.h"
+
+void AGasaLevelScriptActor::BeginPlay()
+{
+ Super::BeginPlay();
+
+ TArray TaggedActors;
+ UGameplayStatics::GetAllActorsWithTag(GetWorld(), Gasa::GetDevOptions()->Tag_GlobalPPV,TaggedActors);
+ for (AActor* Actor : TaggedActors)
+ {
+ GlobalPPV = Cast(Actor);
+
+ APostProcessVolume* PPV = Gasa::GetLevelActor(this)->GlobalPPV;
+ UMaterialInstance* Blendable = Cast(PPV->Settings.WeightedBlendables.Array[0].Object);
+ UMaterialInstanceDynamic* MID = UMaterialInstanceDynamic::Create(Blendable, this);
+ PPV->Settings.WeightedBlendables.Array[0].Object = MID;
+ break;
+ }
+}
diff --git a/Project/Source/Gasa/GasaLevelScriptActor.h b/Project/Source/Gasa/GasaLevelScriptActor.h
new file mode 100644
index 0000000..fcd023b
--- /dev/null
+++ b/Project/Source/Gasa/GasaLevelScriptActor.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "Engine/LevelScriptActor.h"
+
+#include "GasaLevelScriptActor.generated.h"
+
+UCLASS(Blueprintable)
+class GASA_API AGasaLevelScriptActor : public ALevelScriptActor
+{
+ GENERATED_BODY()
+public:
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Post Process")
+ TObjectPtr GlobalPPV;
+
+#pragma region Actor
+ void BeginPlay() override;
+#pragma region endActor
+};
+
+namespace Gasa
+{
+ inline
+ AGasaLevelScriptActor* GetLevelActor(UObject* Context, ULevel* OwnerLevel = nullptr) {
+ UWorld* World = GEngine->GetWorldFromContextObjectChecked(Context);
+ return Cast(World->GetLevelScriptActor(OwnerLevel));
+ }
+}
diff --git a/Project/Source/Gasa/GasaLibrary.cpp b/Project/Source/Gasa/GasaLibrary.cpp
new file mode 100644
index 0000000..f0513cb
--- /dev/null
+++ b/Project/Source/Gasa/GasaLibrary.cpp
@@ -0,0 +1,9 @@
+#include "GasaLibrary.h"
+
+#include "GasaDevOptions.h"
+#include "GasaLevelScriptActor.h"
+#include "Engine/LevelScriptActor.h"
+
+UGasaDevOptions* UGasaLib::GetDevOptions(UObject* Context) {
+ return Gasa::GetMutDevOptions();
+}
diff --git a/Project/Source/Gasa/GasaLibrary.h b/Project/Source/Gasa/GasaLibrary.h
new file mode 100644
index 0000000..383c27b
--- /dev/null
+++ b/Project/Source/Gasa/GasaLibrary.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "GasaCommon.h"
+
+#include "GasaLibrary.Generated.h"
+
+
+// UINTERFACE()
+// class
+
+UCLASS(BlueprintType)
+class GASA_API UGasaLib : public UBlueprintFunctionLibrary
+{
+ GENERATED_BODY()
+public:
+
+#pragma region Game
+
+ UFUNCTION(BlueprintCallable, Category="Gasa|Game", BlueprintPure, meta=(WorldContext="Context"))
+ static UGasaDevOptions* GetDevOptions(UObject* Context);
+#pragma endregion Game
+};
+
diff --git a/Project/Source/Gasa/GasaPlayerController.cpp b/Project/Source/Gasa/GasaPlayerController.cpp
index ae36fa9..5bde786 100644
--- a/Project/Source/Gasa/GasaPlayerController.cpp
+++ b/Project/Source/Gasa/GasaPlayerController.cpp
@@ -3,10 +3,19 @@
#include "Engine/LocalPlayer.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
-#include "Character/GasaCharacter.h"
+#include "Actors/CameraMount.h"
+#include "Camera/CameraComponent.h"
+#include "Characters/GasaCharacter.h"
+#include "Components/CapsuleComponent.h"
+#include "GameFramework/SpringArmComponent.h"
+#include "Kismet/KismetSystemLibrary.h"
AGasaPlayerController::AGasaPlayerController()
{
+ PrimaryActorTick.bCanEverTick = true;
+ bAutoManageActiveCameraTarget = false;
+
+ // Replication
bReplicates = true;
}
@@ -53,6 +62,18 @@ void AGasaPlayerController::Move(FInputActionValue const& ActionValue)
#endif
}
+void AGasaPlayerController::OnPossess(APawn* InPawn)
+{
+ Super::OnPossess(InPawn);
+
+ Cam->AttachToActor(InPawn, FAttachmentTransformRules::KeepRelativeTransform);
+}
+
+void AGasaPlayerController::OnUnPossess()
+{
+ Super::OnUnPossess();
+}
+
#pragma region PlayerController
void AGasaPlayerController::PlayerTick(float DeltaTime)
{
@@ -110,6 +131,7 @@ void AGasaPlayerController::BeginPlay()
Super::BeginPlay();
check(IMC);
+
UEnhancedInputLocalPlayerSubsystem*
EILP_Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer());
check(EILP_Subsystem);
@@ -123,4 +145,40 @@ void AGasaPlayerController::BeginPlay()
SetInputMode(MouseMode);
}
}
+
+void AGasaPlayerController::PostInitializeComponents()
+{
+ Super::PostInitializeComponents();
+
+ Cam = GetWorld()->SpawnActor(CamClass, FActorSpawnParameters() );
+ SetViewTarget(Cam);
+}
+
+void AGasaPlayerController::Tick(float DeltaSeconds)
+{
+ Super::Tick(DeltaSeconds);
+
+#if 0
+ switch (HighlightState)
+ {
+ case EHighlight::Disabled:
+ break;
+ case EHighlight::Enabled:
+ {
+ UCapsuleComponent* Capsule = GetCapsuleComponent();
+
+ UKismetSystemLibrary::DrawDebugCapsule(this
+ , Capsule->GetComponentLocation()
+ , Capsule->GetScaledCapsuleHalfHeight()
+ , Capsule->GetScaledCapsuleRadius()
+ , Capsule->GetComponentRotation()
+ , HighlightColor
+ , 0.f
+ , 1.f
+ );
+ }
+ break;
+ }
+#endif
+}
#pragma endregion Actor
diff --git a/Project/Source/Gasa/GasaPlayerController.h b/Project/Source/Gasa/GasaPlayerController.h
index fd7c367..b3dfd32 100644
--- a/Project/Source/Gasa/GasaPlayerController.h
+++ b/Project/Source/Gasa/GasaPlayerController.h
@@ -11,13 +11,37 @@ class GASA_API AGasaPlayerController : public APlayerController
{
GENERATED_BODY()
public:
+#pragma region Camera
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ TSubclassOf CamClass;
+
+ UPROPERTY(EditAnywhere, BlueprintReadWrite)
+ TObjectPtr Cam;
+#pragma endregion Camera
+ // This will be implemented in the base until it needs to be lifted into an abstraction.
+#if 0
+#pragma region Highlighting
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Highlighting")
+ EHighlight HighlightState;
+
+ UFUNCTION(BlueprintCallable, Category="Highlighting")
+ void SetHighlight( EHighlight Desired );
+
+ UFUNCTION(BlueprintCallable, Category="Highlighting")
+ FORCEINLINE void Highlight() { SetHighlight(EHighlight::Enabled); };
+
+ UFUNCTION(BlueprintCallable, Category="Highlighting")
+ FORCEINLINE void Dehighlight() { SetHighlight(EHighlight::Disabled); };
+#pragma endregion Highlighting
+#endif
+
#pragma region Input
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
- AGasaCharacter* HoverPrev;
+ TObjectPtr HoverPrev;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
- AGasaCharacter* HoverCurr;
+ TObjectPtr HoverCurr;
UPROPERTY(EditAnywhere, Category="Input")
TObjectPtr IMC;
@@ -31,6 +55,10 @@ public:
void Move(FInputActionValue const& ActionValue);
#pragma region PlayerController
+ void OnPossess(APawn* InPawn) override;
+
+ void OnUnPossess() override;
+
void PlayerTick(float DeltaTime) override;
void SetupInputComponent() override;
@@ -38,5 +66,9 @@ public:
#pragma region Actor
void BeginPlay() override;
+
+ void PostInitializeComponents() override;
+
+ void Tick(float DeltaSeconds) override;
#pragma endregion Actor
};
diff --git a/Project/Source/GasaEditor.Target.cs b/Project/Source/GasaEditor.Target.cs
index 216313a..0257725 100644
--- a/Project/Source/GasaEditor.Target.cs
+++ b/Project/Source/GasaEditor.Target.cs
@@ -12,6 +12,7 @@ public class GasaEditorTarget : TargetRules
DefaultBuildSettings = BuildSettingsVersion.Latest;
bUseUnityBuild = false;
+ bUseXGEController = false;
ExtraModuleNames.Add("Gasa");
ExtraModuleNames.Add("GasaEditor");