Compare commits
17 Commits
3a58e90802
...
old_repo_o
Author | SHA1 | Date | |
---|---|---|---|
d97ee1d302 | |||
1b5d2a3ff6 | |||
ca779b627b | |||
a885201b81 | |||
07c5420bc2 | |||
fe2abe1972 | |||
e8fb014d29 | |||
c4e40037ed | |||
33b3723b82 | |||
ae1e28a072 | |||
ef002ccf53 | |||
035ad8de6f | |||
a604117e95 | |||
f17c53a1a9 | |||
bd0c8a0878 | |||
22aee515ed | |||
8f84dcf3d3 |
51
.gitignore
vendored
51
.gitignore
vendored
@ -1,31 +1,38 @@
|
|||||||
Project/Binaries
|
*/Binaries/Win64/*.patch_*.*
|
||||||
Project/Intermediate
|
|
||||||
Project/Saved/Crashes
|
Project/.idea
|
||||||
Project/Saved/SourceControl
|
|
||||||
Project/Saved/ShaderDebugInfo
|
|
||||||
Project/Saved/Logs
|
|
||||||
Project/Saved/Autosaves
|
|
||||||
Project/Saved/Config/CrashReportClient
|
|
||||||
Project/Saved/Config/WindowsEditor
|
|
||||||
Project/Saved/Config/WorldState
|
|
||||||
Project/Saved/AutoScreenshot.png
|
|
||||||
Project/Platforms
|
|
||||||
Project/.vs
|
Project/.vs
|
||||||
Project/.vsconfig
|
Project/.vsconfig
|
||||||
*.sln
|
|
||||||
*.target
|
|
||||||
*.modules
|
|
||||||
Project/.idea
|
|
||||||
|
|
||||||
Project/Saved/Screenshots
|
Project/Binaries
|
||||||
*/Binaries/Win64/*.patch_*.*
|
|
||||||
Project/Saved/ImGui
|
|
||||||
Project/Saved/ImGui/imgui.ini
|
|
||||||
GasaGen_*.pdb
|
|
||||||
Project/Binaries/GasaGen.exe
|
Project/Binaries/GasaGen.exe
|
||||||
Project/Binaries/GasaGen.map
|
Project/Binaries/GasaGen.map
|
||||||
Project/Binaries/GasaGen.obj
|
Project/Binaries/GasaGen.obj
|
||||||
Project/Binaries/vc140.pdb
|
Project/Binaries/vc140.pdb
|
||||||
|
|
||||||
|
Project/Intermediate
|
||||||
|
|
||||||
|
Project/Platforms
|
||||||
|
|
||||||
Project/Saved/Config/ConsoleHistory.ini
|
Project/Saved/Config/ConsoleHistory.ini
|
||||||
*.pdb
|
|
||||||
|
Project/Saved/Autosaves
|
||||||
|
Project/Saved/AutoScreenshot.png
|
||||||
|
Project/Saved/Config/CrashReportClient
|
||||||
|
Project/Saved/Config/WindowsEditor
|
||||||
|
Project/Saved/Config/WorldState
|
||||||
|
Project/Saved/Crashes
|
||||||
Project/Saved/Diff
|
Project/Saved/Diff
|
||||||
|
Project/Saved/ImGui
|
||||||
|
Project/Saved/ImGui/imgui.ini
|
||||||
|
Project/Saved/Logs
|
||||||
|
Project/Saved/Screenshots
|
||||||
|
Project/Saved/ShaderDebugInfo
|
||||||
|
Project/Saved/SourceControl
|
||||||
|
|
||||||
|
*.modules
|
||||||
|
*.pdb
|
||||||
|
*.sln
|
||||||
|
*.target
|
||||||
|
|
||||||
|
GasaGen_*.pdb
|
||||||
|
BIN
Project/Binaries/Win64/UnrealEditor-GasaEditor.dll
(Stored with Git LFS)
BIN
Project/Binaries/Win64/UnrealEditor-GasaEditor.dll
(Stored with Git LFS)
Binary file not shown.
File diff suppressed because one or more lines are too long
@ -49,6 +49,15 @@ r.ReflectionMethod=1
|
|||||||
r.Shadow.Virtual.Enable=1
|
r.Shadow.Virtual.Enable=1
|
||||||
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
|
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
|
||||||
r.CustomDepth=3
|
r.CustomDepth=3
|
||||||
|
r.DefaultFeature.Bloom=False
|
||||||
|
r.DefaultFeature.AmbientOcclusion=False
|
||||||
|
r.DefaultFeature.AmbientOcclusionStaticFraction=False
|
||||||
|
r.DefaultFeature.AutoExposure=False
|
||||||
|
r.DefaultFeature.MotionBlur=False
|
||||||
|
r.AntiAliasingMethod=0
|
||||||
|
r.MSAACount=1
|
||||||
|
r.ScreenPercentage.Default=25.000000
|
||||||
|
r.SupportSkyAtmosphere=False
|
||||||
|
|
||||||
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
|
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
|
||||||
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
|
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'
|
||||||
@ -130,3 +139,4 @@ ManualIPAddress=
|
|||||||
+CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
|
+CollisionChannelRedirects=(OldName="Dynamic",NewName="WorldDynamic")
|
||||||
+CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
|
+CollisionChannelRedirects=(OldName="VehicleMovement",NewName="Vehicle")
|
||||||
+CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
|
+CollisionChannelRedirects=(OldName="PawnMovement",NewName="Pawn")
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ Tag_GlobalPPV=Global_PPV
|
|||||||
Template_PlayerCamera=/Game/Actors/BP_CameraMount.BP_CameraMount_C
|
Template_PlayerCamera=/Game/Actors/BP_CameraMount.BP_CameraMount_C
|
||||||
Template_HUD_HostUI=/Game/UI/UI_Host.UI_Host_C
|
Template_HUD_HostUI=/Game/UI/UI_Host.UI_Host_C
|
||||||
Template_HostWidgetController=/Game/UI/BP_HostWidgetController.BP_HostWidgetController_C
|
Template_HostWidgetController=/Game/UI/BP_HostWidgetController.BP_HostWidgetController_C
|
||||||
|
TaggedMessageTable=/Game/Core/Tables/DT_TaggedMessages.DT_TaggedMessages
|
||||||
|
|
||||||
[/Script/GameplayAbilities.AbilitySystemGlobals]
|
[/Script/GameplayAbilities.AbilitySystemGlobals]
|
||||||
bUseDebugTargetFromHud=true
|
bUseDebugTargetFromHud=true
|
||||||
|
20
Project/Config/DefaultGameplayTags.ini
Normal file
20
Project/Config/DefaultGameplayTags.ini
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
[/Script/GameplayTags.GameplayTagsSettings]
|
||||||
|
ImportTagsFromConfig=True
|
||||||
|
WarnOnInvalidTags=True
|
||||||
|
ClearInvalidTags=False
|
||||||
|
AllowEditorTagUnloading=True
|
||||||
|
AllowGameTagUnloading=False
|
||||||
|
FastReplication=False
|
||||||
|
InvalidTagCharacters="\"\',"
|
||||||
|
+GameplayTagTableList=/Game/Core/Tables/DT_PrimaryAttributes.DT_PrimaryAttributes
|
||||||
|
NumBitsForContainerSize=6
|
||||||
|
NetIndexFirstBitSegment=16
|
||||||
|
+GameplayTagList=(Tag="Attributes.Vital.Health",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Attributes.Vital.Mana",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Attributes.Vital.MaxHealth",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Attributes.Vital.MaxMana",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Message.Crystal.Health",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Message.Crystal.Mana",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Message.Potion.Health",DevComment="")
|
||||||
|
+GameplayTagList=(Tag="Message.Potion.Mana",DevComment="")
|
||||||
|
|
BIN
Project/Content/Core/AbilitySystem/GE_AreaFire.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/AbilitySystem/GE_AreaFire.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/AbilitySystem/GE_CrystalHeal.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/AbilitySystem/GE_CrystalHeal.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/AbilitySystem/GE_CrystalMana.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/AbilitySystem/GE_CrystalMana.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/AbilitySystem/GE_PotionHealth.uasset
(Stored with Git LFS)
BIN
Project/Content/Core/AbilitySystem/GE_PotionHealth.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Core/AbilitySystem/GE_PotionMana.uasset
(Stored with Git LFS)
BIN
Project/Content/Core/AbilitySystem/GE_PotionMana.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Core/BP_AreaFire_RawEffect.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/BP_AreaFire_RawEffect.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/DT_PrimaryAttributes.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/DT_PrimaryAttributes.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/DT_TaggedMessages.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/DT_TaggedMessages.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/Game/BP_HUD.uasset
(Stored with Git LFS)
BIN
Project/Content/Core/Game/BP_HUD.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Core/Pickups/BP_HealthCrystal_RawEffect.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/Pickups/BP_HealthCrystal_RawEffect.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/Pickups/BP_HealthPotion.uasset
(Stored with Git LFS)
BIN
Project/Content/Core/Pickups/BP_HealthPotion.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Core/Pickups/BP_HealthPotion_RawEffect.uasset
(Stored with Git LFS)
BIN
Project/Content/Core/Pickups/BP_HealthPotion_RawEffect.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Core/Pickups/BP_ManaCrystal_RawEffect.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/Pickups/BP_ManaCrystal_RawEffect.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/Pickups/BP_ManaPotion_RawEffect.uasset
(Stored with Git LFS)
BIN
Project/Content/Core/Pickups/BP_ManaPotion_RawEffect.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Core/Tables/CT_Potion.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/Tables/CT_Potion.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/Tables/DT_PrimaryAttributes.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/Tables/DT_PrimaryAttributes.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Core/Tables/DT_TaggedMessages.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Core/Tables/DT_TaggedMessages.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Levels/StartupMap.umap
(Stored with Git LFS)
BIN
Project/Content/Levels/StartupMap.umap
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/MaterialLibrary/M_Crystal.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/MaterialLibrary/M_Crystal.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/Pickups/HealthCrystal/Materials/MI_HealthCrystal.uasset
(Stored with Git LFS)
BIN
Project/Content/Pickups/HealthCrystal/Materials/MI_HealthCrystal.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Pickups/HealthCrystal/Materials/M_HealthCrystal.uasset
(Stored with Git LFS)
BIN
Project/Content/Pickups/HealthCrystal/Materials/M_HealthCrystal.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/Pickups/MI_CrystalMana.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/Pickups/MI_CrystalMana.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/UI/BP_HostWidgetController.uasset
(Stored with Git LFS)
BIN
Project/Content/UI/BP_HostWidgetController.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/UI/DT_StyleText_EffectMessage.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/UI/DT_StyleText_EffectMessage.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/UI/Globes/MI_BlackBG.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/UI/Globes/MI_BlackBG.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/UI/RTD_Default.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/UI/RTD_Default.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/UI/UI_EffectMessage.uasset
(Stored with Git LFS)
Normal file
BIN
Project/Content/UI/UI_EffectMessage.uasset
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
Project/Content/UI/UI_GlobeTemplate.uasset
(Stored with Git LFS)
BIN
Project/Content/UI/UI_GlobeTemplate.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Project/Content/UI/UI_Host.uasset
(Stored with Git LFS)
BIN
Project/Content/UI/UI_Host.uasset
(Stored with Git LFS)
Binary file not shown.
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"ColumnWidths":
|
||||||
|
{
|
||||||
|
"DevComment": 405,
|
||||||
|
"Tag": 381
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ColumnWidths":
|
||||||
|
{
|
||||||
|
"TextStyle": 1099
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"ColumnWidths":
|
||||||
|
{
|
||||||
|
"Image": 487,
|
||||||
|
"Tag": 246,
|
||||||
|
"Message": 439,
|
||||||
|
"MessageTemplate": 232
|
||||||
|
}
|
||||||
|
}
|
38
Project/Source/Gasa/AbilitySystem/EffectProperties.cpp
Normal file
38
Project/Source/Gasa/AbilitySystem/EffectProperties.cpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include "EffectProperties.h"
|
||||||
|
|
||||||
|
#include "AbilitySystemComponent.h"
|
||||||
|
#include "AbilitySystemGlobals.h"
|
||||||
|
#include "GameplayEffect.h"
|
||||||
|
#include "GameplayEffectExtension.h"
|
||||||
|
#include "GameFramework/Pawn.h"
|
||||||
|
#include "GameFramework/PlayerController.h"
|
||||||
|
|
||||||
|
void FEffectProperties::Populate(FGameplayEffectModCallbackData const& Data)
|
||||||
|
{
|
||||||
|
Context = Data.EffectSpec.GetContext();
|
||||||
|
SourceAbilitySystem = Context.GetOriginalInstigatorAbilitySystemComponent();
|
||||||
|
|
||||||
|
if (IsValid(SourceAbilitySystem)
|
||||||
|
&& SourceAbilitySystem->AbilityActorInfo.IsValid()
|
||||||
|
&& SourceAbilitySystem->AbilityActorInfo->AvatarActor.IsValid())
|
||||||
|
{
|
||||||
|
FGameplayAbilityActorInfo* AbilityInfo = SourceAbilitySystem->AbilityActorInfo.Get();
|
||||||
|
SourceAvatar = AbilityInfo->AvatarActor.Get();
|
||||||
|
SourceController = AbilityInfo->PlayerController.Get();
|
||||||
|
|
||||||
|
if (SourceController == nullptr && SourceAvatar)
|
||||||
|
{
|
||||||
|
APawn* Pawn = Cast<APawn>(SourceAvatar);
|
||||||
|
if (Pawn)
|
||||||
|
SourceController = Pawn->GetController();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Data.Target.AbilityActorInfo.IsValid() && Data.Target.AbilityActorInfo->AvatarActor.IsValid())
|
||||||
|
{
|
||||||
|
FGameplayAbilityActorInfo* AbilityInfo = Data.Target.AbilityActorInfo.Get();
|
||||||
|
TargetAvatar = AbilityInfo->AvatarActor.Get();
|
||||||
|
TargetController = AbilityInfo->PlayerController.Get();
|
||||||
|
TargetAbilitySystem = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(TargetAvatar);
|
||||||
|
}
|
||||||
|
}
|
34
Project/Source/Gasa/AbilitySystem/EffectProperties.h
Normal file
34
Project/Source/Gasa/AbilitySystem/EffectProperties.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "GameplayEffectTypes.h"
|
||||||
|
#include "GasaCommon.h"
|
||||||
|
|
||||||
|
#include "EffectProperties.generated.h"
|
||||||
|
|
||||||
|
USTRUCT()
|
||||||
|
struct GASA_API FEffectProperties
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
FGameplayEffectContextHandle Context;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere)
|
||||||
|
UAbilitySystemComponent* SourceAbilitySystem;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere)
|
||||||
|
AActor* SourceAvatar;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere)
|
||||||
|
AController* SourceController;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere)
|
||||||
|
UAbilitySystemComponent* TargetAbilitySystem;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere)
|
||||||
|
AActor* TargetAvatar;
|
||||||
|
|
||||||
|
UPROPERTY(VisibleAnywhere)
|
||||||
|
APlayerController* TargetController;
|
||||||
|
|
||||||
|
void Populate(FGameplayEffectModCallbackData const& Data);
|
||||||
|
};
|
@ -1 +1,33 @@
|
|||||||
#include "GasaAbilitySystemComponent.h"
|
#include "GasaAbilitySystemComponent.h"
|
||||||
|
|
||||||
|
#include "Engine/Engine.h"
|
||||||
|
#include "Engine/GameViewportClient.h"
|
||||||
|
#include "Game/GasaGameState.h"
|
||||||
|
#include "Game/GasaPlayerController.h"
|
||||||
|
#include "GameFramework/HUD.h"
|
||||||
|
#include "Slate/SceneViewport.h"
|
||||||
|
#include "UI/GasaHUD.h"
|
||||||
|
#include "CogDebugDraw.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace Gasa;
|
||||||
|
|
||||||
|
void UGasaAbilitySystemComp::OnAbilityActorInfoSet()
|
||||||
|
{
|
||||||
|
if ( ! OnGameplayEffectAppliedDelegateToSelf.IsBoundToObject(this))
|
||||||
|
OnGameplayEffectAppliedDelegateToSelf.AddUObject(this, & ThisClass::EffectApplied);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UGasaAbilitySystemComp::EffectApplied(UAbilitySystemComponent* AbilitySystem, FGameplayEffectSpec const& Spec,
|
||||||
|
FActiveGameplayEffectHandle ActiveEffect)
|
||||||
|
{
|
||||||
|
Log("EFFECT APPLIED?");
|
||||||
|
FGameplayTagContainer Tags;
|
||||||
|
Spec.GetAllAssetTags(Tags);
|
||||||
|
Event_OnEffectAppliedAssetTags.Broadcast(Tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UGasaAbilitySystemComp::InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor)
|
||||||
|
{
|
||||||
|
Super::InitAbilityActorInfo(InOwnerActor, InAvatarActor);
|
||||||
|
}
|
||||||
|
@ -1,15 +1,27 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "AbilitySystemComponent.h"
|
#include "AbilitySystemComponent.h"
|
||||||
|
|
||||||
#include "GasaCommon.h"
|
#include "GasaCommon.h"
|
||||||
|
|
||||||
#include "GasaAbilitySystemComponent.generated.h"
|
#include "GasaAbilitySystemComponent.generated.h"
|
||||||
|
|
||||||
|
|
||||||
|
DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTagsSig, FGameplayTagContainer const& /*Tags*/);
|
||||||
|
|
||||||
|
|
||||||
UCLASS(BlueprintType)
|
UCLASS(BlueprintType)
|
||||||
class GASA_API UGasaAbilitySystemComp : public UAbilitySystemComponent
|
class GASA_API UGasaAbilitySystemComp : public UAbilitySystemComponent
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
FEffectAssetTagsSig Event_OnEffectAppliedAssetTags;
|
||||||
|
|
||||||
|
void OnAbilityActorInfoSet();
|
||||||
|
|
||||||
|
void EffectApplied(UAbilitySystemComponent* AbilitySystem, FGameplayEffectSpec const& Spec, FActiveGameplayEffectHandle ActiveEffect);
|
||||||
|
|
||||||
|
#pragma region AbilitySystemComponent
|
||||||
|
void InitAbilityActorInfo(AActor* InOwnerActor, AActor* InAvatarActor) override;
|
||||||
|
#pragma endregion AbilitySystemComponent
|
||||||
};
|
};
|
@ -18,7 +18,7 @@ namespace Gasa
|
|||||||
|
|
||||||
// From: UAbilitySystemGlobals::GetAbilitySystemComponentFromActor
|
// From: UAbilitySystemGlobals::GetAbilitySystemComponentFromActor
|
||||||
inline
|
inline
|
||||||
UGasaAbilitySystemComp* GetAbilitySystem(AActor* Actor, bool LookForComponent = false)
|
UGasaAbilitySystemComp* GetAbilitySystem(AActor* Actor, bool LookForComponent = true)
|
||||||
{
|
{
|
||||||
if (Actor == nullptr)
|
if (Actor == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Generated by GasaGen/GasaGen_UGasaAttributeSet.cpp
|
// Generated by GasaGen/GasaGen_UGasaAttributeSet.cpp
|
||||||
#include "GasaAttributeSet.h"
|
#include "GasaAttributeSet.h"
|
||||||
#include "GasaAttributeSet_Inlines.h"
|
#include "GasaAttributeSet_Inlines.h"
|
||||||
|
#include "EffectProperties.h"
|
||||||
|
|
||||||
#include "AbilitySystemComponent.h"
|
#include "AbilitySystemComponent.h"
|
||||||
#include "Net/UnrealNetwork.h"
|
#include "Net/UnrealNetwork.h"
|
||||||
@ -41,6 +42,35 @@ void UGasaAttributeSet::Client_OnRep_MaxMana( FGameplayAttributeData& PrevMaxMan
|
|||||||
}
|
}
|
||||||
#pragma endregion Rep Notifies
|
#pragma endregion Rep Notifies
|
||||||
|
|
||||||
|
void UGasaAttributeSet::PostGameplayEffectExecute( FGameplayEffectModCallbackData const& Data )
|
||||||
|
{
|
||||||
|
Super::PostGameplayEffectExecute( Data );
|
||||||
|
FEffectProperties Props;
|
||||||
|
Props.Populate( Data );
|
||||||
|
}
|
||||||
|
|
||||||
|
void UGasaAttributeSet::PreAttributeChange( FGameplayAttribute const& Attribute, float& NewValue )
|
||||||
|
{
|
||||||
|
Super::PreAttributeChange( Attribute, NewValue );
|
||||||
|
|
||||||
|
if ( Attribute == GetHealthAttribute() )
|
||||||
|
{
|
||||||
|
NewValue = FMath::Clamp( NewValue, 0, GetMaxHealth() );
|
||||||
|
}
|
||||||
|
if ( Attribute == GetMaxHealthAttribute() )
|
||||||
|
{
|
||||||
|
NewValue = FMath::Clamp( NewValue, 0, 99999.000000 );
|
||||||
|
}
|
||||||
|
if ( Attribute == GetManaAttribute() )
|
||||||
|
{
|
||||||
|
NewValue = FMath::Clamp( NewValue, 0, GetMaxMana() );
|
||||||
|
}
|
||||||
|
if ( Attribute == GetMaxManaAttribute() )
|
||||||
|
{
|
||||||
|
NewValue = FMath::Clamp( NewValue, 0, 99999.000000 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void UGasaAttributeSet::GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const
|
void UGasaAttributeSet::GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const
|
||||||
{
|
{
|
||||||
Super::GetLifetimeReplicatedProps( OutLifetimeProps );
|
Super::GetLifetimeReplicatedProps( OutLifetimeProps );
|
||||||
|
@ -9,20 +9,16 @@ class GASA_API UGasaAttributeSet : public UAttributeSet
|
|||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
public:
|
public:
|
||||||
UPROPERTY( ReplicatedUsing = Client_OnRep_Health, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
|
||||||
FGameplayAttributeData Health;
|
|
||||||
|
|
||||||
UPROPERTY( ReplicatedUsing = Client_OnRep_MaxHealth, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
|
||||||
FGameplayAttributeData MaxHealth;
|
|
||||||
|
|
||||||
UPROPERTY( ReplicatedUsing = Client_OnRep_Mana, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
|
||||||
FGameplayAttributeData Mana;
|
|
||||||
|
|
||||||
UPROPERTY( ReplicatedUsing = Client_OnRep_MaxMana, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
|
||||||
FGameplayAttributeData MaxMana;
|
|
||||||
|
|
||||||
UGasaAttributeSet();
|
UGasaAttributeSet();
|
||||||
|
|
||||||
|
UPROPERTY( ReplicatedUsing = Client_OnRep_Health, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
|
FGameplayAttributeData Health;
|
||||||
|
UPROPERTY( ReplicatedUsing = Client_OnRep_MaxHealth, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
|
FGameplayAttributeData MaxHealth;
|
||||||
|
UPROPERTY( ReplicatedUsing = Client_OnRep_Mana, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
|
FGameplayAttributeData Mana;
|
||||||
|
UPROPERTY( ReplicatedUsing = Client_OnRep_MaxMana, EditAnywhere, BlueprintReadWrite, Category = "Attributes" )
|
||||||
|
FGameplayAttributeData MaxMana;
|
||||||
|
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void Client_OnRep_Health( FGameplayAttributeData& PrevHealth );
|
void Client_OnRep_Health( FGameplayAttributeData& PrevHealth );
|
||||||
@ -90,6 +86,12 @@ public:
|
|||||||
}
|
}
|
||||||
#pragma endregion Setters
|
#pragma endregion Setters
|
||||||
|
|
||||||
|
#pragma region AttributeSet
|
||||||
|
void
|
||||||
|
PreAttributeChange( const FGameplayAttribute& Attribute, float& NewValue ) override;
|
||||||
|
void PostGameplayEffectExecute( FGameplayEffectModCallbackData const& Data ) override;
|
||||||
|
#pragma endregion AttributeSet
|
||||||
|
|
||||||
#pragma region UObject
|
#pragma region UObject
|
||||||
void
|
void
|
||||||
GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const override;
|
GetLifetimeReplicatedProps( TArray<FLifetimeProperty>& OutLifetimeProps ) const override;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "GasaEffectActor.h"
|
#include "GasaEffectActor.h"
|
||||||
|
|
||||||
#include "GasaAbilitySystemComponent_Inlines.h"
|
#include "GasaAbilitySystemComponent_Inlines.h"
|
||||||
|
#include "GasaContainers.h"
|
||||||
using namespace Gasa;
|
using namespace Gasa;
|
||||||
|
|
||||||
AGasaEffectActor::AGasaEffectActor()
|
AGasaEffectActor::AGasaEffectActor()
|
||||||
@ -8,16 +9,118 @@ AGasaEffectActor::AGasaEffectActor()
|
|||||||
PrimaryActorTick.bCanEverTick = false;
|
PrimaryActorTick.bCanEverTick = false;
|
||||||
|
|
||||||
RootComponent = CreateDefaultSubobject<USceneComponent>("Root");
|
RootComponent = CreateDefaultSubobject<USceneComponent>("Root");
|
||||||
|
|
||||||
|
Level = 1.f;
|
||||||
|
|
||||||
|
InstantEffectUsage = EInstantEffectUsagePolicy::DoNotApply;
|
||||||
|
DurationEffectUsage = DefaultEffectUsagePolicy;
|
||||||
|
InfiniteEffectUsage = DefaultEffectUsagePolicy;
|
||||||
|
|
||||||
|
bDestroyOnEffectRemoval = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGasaEffectActor::ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEffect> EffectClass)
|
void AGasaEffectActor::ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEffect> EffectClass, bool bRemoveOnEndOverlap)
|
||||||
{
|
{
|
||||||
UGasaAbilitySystemComp* AS = GetAbilitySystem(Actor, true);
|
UGasaAbilitySystemComp* AS = GetAbilitySystem(Actor, true);
|
||||||
|
|
||||||
FGameplayEffectContextHandle
|
FGameplayEffectContextHandle
|
||||||
Context = AS->MakeEffectContext();
|
Context = AS->MakeEffectContext();
|
||||||
Context.AddSourceObject(Actor);
|
Context.AddSourceObject(Actor);
|
||||||
|
|
||||||
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( EffectClass, 1.0f, Context );
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( EffectClass, Level, Context );
|
||||||
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
if (bRemoveOnEndOverlap)
|
||||||
|
ActiveEffectsToRemove.Add(ActiveEffect, AS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AGasaEffectActor::OnOverlap(AActor* Actor)
|
||||||
|
{
|
||||||
|
UGasaAbilitySystemComp* AS = GetAbilitySystem(Actor, true);
|
||||||
|
FGameplayEffectContextHandle
|
||||||
|
Context = AS->MakeEffectContext();
|
||||||
|
Context.AddSourceObject(Actor);
|
||||||
|
|
||||||
|
if (InstantEffectClass && InstantEffectUsage == EInstantEffectUsagePolicy::ApplyOnOverlap)
|
||||||
|
{
|
||||||
|
FGameplayEffectSpecHandle Spec= AS->MakeOutgoingSpec( InstantEffectClass, Level, Context );
|
||||||
|
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
}
|
||||||
|
if (DurationEffectClass)
|
||||||
|
{
|
||||||
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::ApplyOnOverlap))
|
||||||
|
{
|
||||||
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( DurationEffectClass, Level, Context );
|
||||||
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
|
ActiveDuration = ActiveEffect;
|
||||||
|
}
|
||||||
|
if (ActiveDuration.IsValid() && Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
|
AS->RemoveActiveGameplayEffect(ActiveDuration);
|
||||||
|
}
|
||||||
|
if (InfiniteEffectClass)
|
||||||
|
{
|
||||||
|
bool bApplyOnOverlap = Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::ApplyOnOverlap);
|
||||||
|
if (bApplyOnOverlap)
|
||||||
|
{
|
||||||
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InfiniteEffectClass, Level, Context );
|
||||||
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
|
ActiveInfinite = ActiveEffect;
|
||||||
|
}
|
||||||
|
if (ActiveInfinite.IsValid() && Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
|
{
|
||||||
|
if (ActiveInfinite.IsValid())
|
||||||
|
AS->RemoveActiveGameplayEffect(ActiveInfinite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AGasaEffectActor::OnEndOverlap(AActor* Actor)
|
||||||
|
{
|
||||||
|
UGasaAbilitySystemComp* AS = GetAbilitySystem(Actor, true);
|
||||||
|
FGameplayEffectContextHandle
|
||||||
|
Context = AS->MakeEffectContext();
|
||||||
|
Context.AddSourceObject(Actor);
|
||||||
|
|
||||||
|
if (InstantEffectClass && InstantEffectUsage == EInstantEffectUsagePolicy::ApplyOnEndOverlap)
|
||||||
|
{
|
||||||
|
FGameplayEffectSpecHandle Spec= AS->MakeOutgoingSpec( InstantEffectClass, Level, Context );
|
||||||
|
AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
}
|
||||||
|
if (DurationEffectClass)
|
||||||
|
{
|
||||||
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::ApplyOnEndOverlap))
|
||||||
|
{
|
||||||
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( DurationEffectClass, Level, Context );
|
||||||
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
if (Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
|
ActiveDuration = ActiveEffect;
|
||||||
|
}
|
||||||
|
if (ActiveDuration.IsValid() && Bitfield_IsSet(DurationEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
|
AS->RemoveActiveGameplayEffect(ActiveDuration);
|
||||||
|
}
|
||||||
|
if (InfiniteEffectClass)
|
||||||
|
{
|
||||||
|
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::ApplyOnEndOverlap))
|
||||||
|
{
|
||||||
|
FGameplayEffectSpecHandle Spec = AS->MakeOutgoingSpec( InfiniteEffectClass, Level, Context );
|
||||||
|
FActiveGameplayEffectHandle ActiveEffect = AS->ApplyGameplayEffectSpecToSelf( * Spec.Data );
|
||||||
|
if (Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnOverlap))
|
||||||
|
ActiveInfinite = ActiveEffect;
|
||||||
|
}
|
||||||
|
if (ActiveInfinite.IsValid() && Bitfield_IsSet(InfiniteEffectUsage, EEffectUsagePolicy::RemoveOnEndOverlap))
|
||||||
|
{
|
||||||
|
if (ActiveInfinite.IsValid())
|
||||||
|
AS->RemoveActiveGameplayEffect(ActiveInfinite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TArray<FActiveGameplayEffectHandle> EffectsRemoved;
|
||||||
|
for (ActiveEffectEntry ActiveEffect : ActiveEffectsToRemove)
|
||||||
|
{
|
||||||
|
if (ActiveEffect.Value != AS)
|
||||||
|
continue;
|
||||||
|
AS->RemoveActiveGameplayEffect(ActiveEffect.Key, 1);
|
||||||
|
EffectsRemoved.Add(ActiveEffect.Key);
|
||||||
|
}
|
||||||
|
RemoveKeys(ActiveEffectsToRemove, EffectsRemoved);
|
||||||
}
|
}
|
||||||
|
@ -2,22 +2,77 @@
|
|||||||
|
|
||||||
#include "GasaCommon.h"
|
#include "GasaCommon.h"
|
||||||
#include "Actors/GasaActor.h"
|
#include "Actors/GasaActor.h"
|
||||||
|
#include "ActiveGameplayEffectHandle.h"
|
||||||
#include "GameFramework/Actor.h"
|
#include "GameFramework/Actor.h"
|
||||||
|
|
||||||
#include "GasaEffectActor.generated.h"
|
#include "GasaEffectActor.generated.h"
|
||||||
|
|
||||||
|
struct FActiveGameplayEffectHandle;
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EInstantEffectUsagePolicy : uint8
|
||||||
|
{
|
||||||
|
DoNotApply,
|
||||||
|
ApplyOnOverlap,
|
||||||
|
ApplyOnEndOverlap,
|
||||||
|
};
|
||||||
|
|
||||||
|
UENUM(BlueprintType, meta = (Bitflags, UseEnumValuesAsMaskValuesInEditor = "true"))
|
||||||
|
enum class EEffectUsagePolicy : uint8
|
||||||
|
{
|
||||||
|
None = 0 UMETA(Hidden),
|
||||||
|
ApplyOnOverlap = bit(0),
|
||||||
|
ApplyOnEndOverlap = bit(1),
|
||||||
|
RemoveOnOverlap = bit(2),
|
||||||
|
RemoveOnEndOverlap = bit(3),
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr int32 DefaultEffectUsagePolicy = (int32(EEffectUsagePolicy::RemoveOnEndOverlap));
|
||||||
|
|
||||||
UCLASS()
|
UCLASS()
|
||||||
class GASA_API AGasaEffectActor : public AGasaActor
|
class GASA_API AGasaEffectActor : public AGasaActor
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
public:
|
public:
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
|
||||||
TSoftClassPtr<UGameplayEffect> InstantEffectClass;
|
|
||||||
|
|
||||||
AGasaEffectActor();
|
AGasaEffectActor();
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "Gameplay Effects")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
void ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEffect> EffectClass );
|
float Level;
|
||||||
};
|
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
|
TSubclassOf<UGameplayEffect> InstantEffectClass;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
|
EInstantEffectUsagePolicy InstantEffectUsage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
|
TSubclassOf<UGameplayEffect> DurationEffectClass;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects", meta=(Bitmask, BitmaskEnum = "/Script/Gasa.EEffectUsagePolicy"))
|
||||||
|
int32 DurationEffectUsage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
|
TSubclassOf<UGameplayEffect> InfiniteEffectClass;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects", meta=(Bitmask, BitmaskEnum = "/Script/Gasa.EEffectUsagePolicy"))
|
||||||
|
int32 InfiniteEffectUsage;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Gameplay Effects")
|
||||||
|
bool bDestroyOnEffectRemoval;
|
||||||
|
|
||||||
|
TMap<FActiveGameplayEffectHandle, UAbilitySystemComponent*> ActiveEffectsToRemove;
|
||||||
|
using ActiveEffectEntry = TTuple<FActiveGameplayEffectHandle, UAbilitySystemComponent*>;
|
||||||
|
|
||||||
|
FActiveGameplayEffectHandle ActiveDuration;
|
||||||
|
FActiveGameplayEffectHandle ActiveInfinite;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable, Category = "Gameplay Effects")
|
||||||
|
void ApplyEffectToActor(AActor* Actor, TSubclassOf<UGameplayEffect> EffectClass, bool bRemoveOnEndOverlap = false);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void OnOverlap(AActor* Actor);
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
void OnEndOverlap(AActor* Actor);
|
||||||
|
};
|
||||||
|
@ -156,11 +156,12 @@ void AGasaCharacter::PossessedBy(AController* NewController)
|
|||||||
GetMesh()->bOnlyAllowAutonomousTickPose = true;
|
GetMesh()->bOnlyAllowAutonomousTickPose = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (bAutoAbilitySystem)
|
if (bAutoAbilitySystem)
|
||||||
{
|
{
|
||||||
// TODO(Ed): Do we need to do this for enemies?
|
|
||||||
AbilitySystem->InitAbilityActorInfo(this, this);
|
AbilitySystem->InitAbilityActorInfo(this, this);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGasaCharacter::SetPlayerDefaults()
|
void AGasaCharacter::SetPlayerDefaults()
|
||||||
@ -179,10 +180,12 @@ void AGasaCharacter::BeginPlay()
|
|||||||
{
|
{
|
||||||
Super::BeginPlay();
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
// TODO(Ed): Find out if this is the best spot todo this
|
||||||
|
// There is also OnPossessed, PostInitializeComponents, etc...
|
||||||
if (bAutoAbilitySystem)
|
if (bAutoAbilitySystem)
|
||||||
{
|
{
|
||||||
// TODO(Ed): Do we need to do this for enemies?
|
|
||||||
AbilitySystem->InitAbilityActorInfo(this, this);
|
AbilitySystem->InitAbilityActorInfo(this, this);
|
||||||
|
Cast<UGasaAbilitySystemComp>(AbilitySystem)->OnAbilityActorInfoSet();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GameFramework")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GameFramework")
|
||||||
EGameFrameworkState GameFrameworkState;
|
EGameFrameworkState GameFrameworkState;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GameFramework", meta=(Bitmask, BitmaskEnum = EGameFrameworkClassFlag))
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "GameFramework", meta=(Bitmask, BitmaskEnum = "/Script/Gasa.EGameFrameworkClassFlag"))
|
||||||
int32 GameFrameworkClassesState;
|
int32 GameFrameworkClassesState;
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category="GameFramework")
|
UFUNCTION(BlueprintCallable, Category="GameFramework")
|
||||||
|
@ -232,8 +232,7 @@ void AGasaGameMode::HandleSeamlessTravelPlayer(AController*& Controller)
|
|||||||
|
|
||||||
void AGasaGameMode::InitializeHUDForPlayer_Implementation(APlayerController* NewPlayer)
|
void AGasaGameMode::InitializeHUDForPlayer_Implementation(APlayerController* NewPlayer)
|
||||||
{
|
{
|
||||||
// Super::InitializeHUDForPlayer_Implementation(NewPlayer);
|
Super::InitializeHUDForPlayer_Implementation(NewPlayer);
|
||||||
NewPlayer->ClientSetHUD(HUDClass);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGasaGameMode::InitSeamlessTravelPlayer(AController* NewController)
|
void AGasaGameMode::InitSeamlessTravelPlayer(AController* NewController)
|
||||||
|
@ -29,7 +29,6 @@ AGasaGameState::AGasaGameState()
|
|||||||
void AGasaGameState::OnGameFrameworkInitialized()
|
void AGasaGameState::OnGameFrameworkInitialized()
|
||||||
{
|
{
|
||||||
NetLog("Received gameplay framework initialization.");
|
NetLog("Received gameplay framework initialization.");
|
||||||
|
|
||||||
if (IsServer())
|
if (IsServer())
|
||||||
{
|
{
|
||||||
if (PlayerArray.Num() > 0)
|
if (PlayerArray.Num() > 0)
|
||||||
@ -41,7 +40,6 @@ void AGasaGameState::OnGameFrameworkInitialized()
|
|||||||
NetLog("Was not able to assign HostingPlayer!", ELogV::Error);
|
NetLog("Was not able to assign HostingPlayer!", ELogV::Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BP_OnGameFrameworkInitialized();
|
BP_OnGameFrameworkInitialized();
|
||||||
}
|
}
|
||||||
#pragma endregion GameFramework
|
#pragma endregion GameFramework
|
||||||
@ -71,7 +69,6 @@ void AGasaGameState::HandleBeginPlay()
|
|||||||
void AGasaGameState::SeamlessTravelTransitionCheckpoint(bool bToTransitionMap)
|
void AGasaGameState::SeamlessTravelTransitionCheckpoint(bool bToTransitionMap)
|
||||||
{
|
{
|
||||||
Super::SeamlessTravelTransitionCheckpoint(bToTransitionMap);
|
Super::SeamlessTravelTransitionCheckpoint(bToTransitionMap);
|
||||||
|
|
||||||
NetLog("SeamlessTravelTransitionCheckpoint");
|
NetLog("SeamlessTravelTransitionCheckpoint");
|
||||||
NetLog(FString("ToTransitionMap: ") + FString(bToTransitionMap ? "true" : "false"));
|
NetLog(FString("ToTransitionMap: ") + FString(bToTransitionMap ? "true" : "false"));
|
||||||
|
|
||||||
@ -90,7 +87,6 @@ void AGasaGameState::SeamlessTravelTransitionCheckpoint(bool bToTransitionMap)
|
|||||||
void AGasaGameState::BeginPlay()
|
void AGasaGameState::BeginPlay()
|
||||||
{
|
{
|
||||||
Super::BeginPlay();
|
Super::BeginPlay();
|
||||||
|
|
||||||
NetLog("BeginPlay");
|
NetLog("BeginPlay");
|
||||||
|
|
||||||
// Notified as initialized here as any possible components should also be initialized by this point.
|
// Notified as initialized here as any possible components should also be initialized by this point.
|
||||||
@ -100,18 +96,17 @@ void AGasaGameState::BeginPlay()
|
|||||||
GI->NotifyGameFrameworkClassReady(EGameFrameworkClassFlag::GameState);
|
GI->NotifyGameFrameworkClassReady(EGameFrameworkClassFlag::GameState);
|
||||||
|
|
||||||
#if ENABLE_COG
|
#if ENABLE_COG
|
||||||
CogWindowManager = NewObject<UCogWindowManager>(this);
|
CogWindowManager = NewObject<UCogWindowManager>(this);
|
||||||
CogWindowManagerRef = CogWindowManager;
|
CogWindowManagerRef = CogWindowManager;
|
||||||
|
|
||||||
// Add all the built-in windows
|
// Add all the built-in windows
|
||||||
Cog::AddAllWindows(*CogWindowManager);
|
Cog::AddAllWindows(*CogWindowManager);
|
||||||
#endif //ENABLE_COG
|
#endif //ENABLE_COG
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGasaGameState::PostInitializeComponents()
|
void AGasaGameState::PostInitializeComponents()
|
||||||
{
|
{
|
||||||
NetLog("PostInitializeComponents");
|
NetLog("PostInitializeComponents");
|
||||||
|
|
||||||
Super::PostInitializeComponents();
|
Super::PostInitializeComponents();
|
||||||
|
|
||||||
if ( ! GetWorld()->IsEditorWorld() && IsServer())
|
if ( ! GetWorld()->IsEditorWorld() && IsServer())
|
||||||
@ -135,7 +130,8 @@ void AGasaGameState::Tick(float DeltaSeconds)
|
|||||||
Super::Tick(DeltaSeconds);
|
Super::Tick(DeltaSeconds);
|
||||||
|
|
||||||
#if ENABLE_COG
|
#if ENABLE_COG
|
||||||
CogWindowManager->Tick(DeltaSeconds);
|
if (CogWindowManager)
|
||||||
|
CogWindowManager->Tick(DeltaSeconds);
|
||||||
#endif //ENABLE_COG
|
#endif //ENABLE_COG
|
||||||
}
|
}
|
||||||
#pragma endregion Actor
|
#pragma endregion Actor
|
||||||
|
@ -52,7 +52,7 @@ public:
|
|||||||
|
|
||||||
#pragma region Actor
|
#pragma region Actor
|
||||||
void BeginPlay() override;
|
void BeginPlay() override;
|
||||||
#pragma region endActor
|
#pragma endregion endActor
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Gasa
|
namespace Gasa
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include "Networking/GasaNetLibrary_Inlines.h"
|
#include "Networking/GasaNetLibrary_Inlines.h"
|
||||||
|
|
||||||
#include "AbilitySystemComponent.h"
|
#include "AbilitySystemComponent.h"
|
||||||
|
#include "DrawDebugHelpers.h"
|
||||||
#include "Engine/LocalPlayer.h"
|
#include "Engine/LocalPlayer.h"
|
||||||
#include "EnhancedInputComponent.h"
|
#include "EnhancedInputComponent.h"
|
||||||
#include "EnhancedInputSubsystems.h"
|
#include "EnhancedInputSubsystems.h"
|
||||||
@ -18,6 +19,7 @@
|
|||||||
#include "GasaGameInstance.h"
|
#include "GasaGameInstance.h"
|
||||||
#include "GasaGameState.h"
|
#include "GasaGameState.h"
|
||||||
#include "GasaPlayerState.h"
|
#include "GasaPlayerState.h"
|
||||||
|
#include "AbilitySystem/GasaAbilitySystemComponent.h"
|
||||||
#include "Actors/CameraMount.h"
|
#include "Actors/CameraMount.h"
|
||||||
#include "UI/GasaHUD.h"
|
#include "UI/GasaHUD.h"
|
||||||
#include "UI/WidgetController.h"
|
#include "UI/WidgetController.h"
|
||||||
@ -66,14 +68,18 @@ void AGasaPlayerController::NetOwner_OnReady()
|
|||||||
if (IsClient())
|
if (IsClient())
|
||||||
ServerRPC_R_NotifyOwningClientReady();
|
ServerRPC_R_NotifyOwningClientReady();
|
||||||
|
|
||||||
|
Cam = GetWorld()->SpawnActor<ACameraMount>(GetDevOptions()->Template_PlayerCamera.Get(), FActorSpawnParameters() );
|
||||||
|
SetViewTarget(Cam);
|
||||||
|
|
||||||
AGasaPlayerState* PS = GetPlayerState();
|
AGasaPlayerState* PS = GetPlayerState();
|
||||||
APlayerCharacter* PlayerChar = GetPawn<APlayerCharacter>();
|
APlayerCharacter* PlayerChar = GetPawn<APlayerCharacter>();
|
||||||
{
|
{
|
||||||
PlayerChar->AbilitySystem = PS->AbilitySystem;
|
PlayerChar->AbilitySystem = PS->AbilitySystem;
|
||||||
PlayerChar->Attributes = PS->Attributes;
|
PlayerChar->Attributes = PS->Attributes;
|
||||||
PlayerChar->AbilitySystem->InitAbilityActorInfo(PS, this);
|
PS->AbilitySystem->InitAbilityActorInfo(PS, PlayerChar);
|
||||||
Cam->AttachToActor(PlayerChar, FAttachmentTransformRules::KeepRelativeTransform);
|
Cast<UGasaAbilitySystemComp>(PS->AbilitySystem)->OnAbilityActorInfoSet();
|
||||||
}
|
}
|
||||||
|
Cam->AttachToActor(PlayerChar, FAttachmentTransformRules::KeepRelativeTransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGasaPlayerController::OnGameFrameworkInitialized()
|
void AGasaPlayerController::OnGameFrameworkInitialized()
|
||||||
@ -416,15 +422,11 @@ void AGasaPlayerController::BeginPlay()
|
|||||||
void AGasaPlayerController::PostInitializeComponents()
|
void AGasaPlayerController::PostInitializeComponents()
|
||||||
{
|
{
|
||||||
Super::PostInitializeComponents();
|
Super::PostInitializeComponents();
|
||||||
|
|
||||||
Cam = GetWorld()->SpawnActor<ACameraMount>(GetDevOptions()->Template_PlayerCamera.Get(), FActorSpawnParameters() );
|
|
||||||
SetViewTarget(Cam);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGasaPlayerController::Tick(float DeltaSeconds)
|
void AGasaPlayerController::Tick(float DeltaSeconds)
|
||||||
{
|
{
|
||||||
Super::Tick(DeltaSeconds);
|
Super::Tick(DeltaSeconds);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
switch (HighlightState)
|
switch (HighlightState)
|
||||||
{
|
{
|
||||||
|
@ -84,6 +84,15 @@ public class Gasa : ModuleRules
|
|||||||
PrivateIncludePathModuleNames.AddRange( new string[]
|
PrivateIncludePathModuleNames.AddRange( new string[]
|
||||||
{
|
{
|
||||||
"CogCommon",
|
"CogCommon",
|
||||||
|
"CogAbility",
|
||||||
|
"CogAI",
|
||||||
|
"CogAll",
|
||||||
|
"CogDebug",
|
||||||
|
"CogDebugEditor",
|
||||||
|
"CogEngine",
|
||||||
|
"CogImgui",
|
||||||
|
"CogInput",
|
||||||
|
"CogWindow",
|
||||||
});
|
});
|
||||||
PrivateDependencyModuleNames.AddRange(new string[]
|
PrivateDependencyModuleNames.AddRange(new string[]
|
||||||
{
|
{
|
||||||
|
@ -13,12 +13,17 @@
|
|||||||
#define rcast( Type, Value ) reinterpret_cast<Type>( Value )
|
#define rcast( Type, Value ) reinterpret_cast<Type>( Value )
|
||||||
#define scast( Type, Value ) static_cast<Type>( Value )
|
#define scast( Type, Value ) static_cast<Type>( Value )
|
||||||
|
|
||||||
|
#define bit(position) (1 << position)
|
||||||
|
|
||||||
#pragma region Math
|
#pragma region Math
|
||||||
#define m_pow2( value ) (value * value)
|
#define m_pow2( value ) (value * value)
|
||||||
#pragma endregion Math
|
#pragma endregion Math
|
||||||
|
|
||||||
#pragma region Engine Forwards
|
#pragma region Engine Forwards
|
||||||
struct FInputActionValue;
|
struct FInputActionValue;
|
||||||
|
struct FGameplayEffectContextHandle;
|
||||||
|
struct FGameplayEffectModCallbackData;
|
||||||
|
struct FGameplayTagContainer;
|
||||||
struct FOnAttributeChangeData;
|
struct FOnAttributeChangeData;
|
||||||
struct FReplicationFlags;
|
struct FReplicationFlags;
|
||||||
|
|
||||||
@ -40,6 +45,7 @@ class UInputAction;
|
|||||||
class UInputMappingContext;
|
class UInputMappingContext;
|
||||||
class USphereComponent;
|
class USphereComponent;
|
||||||
class USpringArmComponent;
|
class USpringArmComponent;
|
||||||
|
class UTexture2D;
|
||||||
#pragma endregion Engine Forwards
|
#pragma endregion Engine Forwards
|
||||||
|
|
||||||
#pragma region Engine Plugin Forwards
|
#pragma region Engine Plugin Forwards
|
||||||
@ -68,6 +74,7 @@ class UGasaObject;
|
|||||||
class UGasaOverlay;
|
class UGasaOverlay;
|
||||||
class UGasaProgressBar;
|
class UGasaProgressBar;
|
||||||
class UGasaSizeBox;
|
class UGasaSizeBox;
|
||||||
|
class UGasaUserWidget;
|
||||||
class UHostWidgetController;
|
class UHostWidgetController;
|
||||||
class UHUDHostWidget;
|
class UHUDHostWidget;
|
||||||
class UWidgetController;
|
class UWidgetController;
|
||||||
@ -78,13 +85,30 @@ namespace Gasa
|
|||||||
{
|
{
|
||||||
inline
|
inline
|
||||||
bool Bitfield_IsSet(int32 Bitfield, int32 Bitmask) {
|
bool Bitfield_IsSet(int32 Bitfield, int32 Bitmask) {
|
||||||
int32 Result = Bitmask == (Bitfield & Bitmask);
|
bool Result = Bitmask == (Bitfield & Bitmask);
|
||||||
return scast(bool, Result);
|
return Result;
|
||||||
|
}
|
||||||
|
inline
|
||||||
|
bool Bitfield_IsSetExactly(int32 Bitfield, int32 Bitmask)
|
||||||
|
{
|
||||||
|
bool Result = Bitfield == (Bitfield & Bitmask);
|
||||||
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Bitfield_Set ( int32& Bitfield, int32 BitsToAdd ) { Bitfield |= BitsToAdd; }
|
inline void Bitfield_Set ( int32& Bitfield, int32 BitsToAdd ) { Bitfield |= BitsToAdd; }
|
||||||
inline void Bitfield_Remove( int32& Bitfield, int32 BitsToRemove ) { Bitfield &= (! BitsToRemove); }
|
inline void Bitfield_Remove( int32& Bitfield, int32 BitsToRemove ) { Bitfield &= (! BitsToRemove); }
|
||||||
inline void Bitfield_Toggle( int32& Bitfield, int32 Bitmask ) { Bitfield ^= Bitmask; }
|
inline void Bitfield_Toggle( int32& Bitfield, int32 Bitmask ) { Bitfield ^= Bitmask; }
|
||||||
|
|
||||||
|
template<typename EnumType>
|
||||||
|
inline
|
||||||
|
bool Bitfield_IsSet(int32 Bitfield, EnumType Mask)
|
||||||
|
{
|
||||||
|
bool Result = int32(Mask) == (Bitfield & int32(Mask));
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
template<typename EnumType> inline void Bitfield_Set ( int32& Bitfield, EnumType BitToAdd ) { Bitfield |= int32(BitToAdd); }
|
||||||
|
template<typename EnumType> inline void Bitfield_Remove( int32& Bitfield, EnumType BitToRemove ) { Bitfield &= (! int32(BitToRemove)); }
|
||||||
|
template<typename EnumType> inline void Bitfield_Toggle( int32& Bitfield, EnumType BitToToggle ) { Bitfield ^= int32(BitToToggle); }
|
||||||
}
|
}
|
||||||
#pragma endregion Bitfields
|
#pragma endregion Bitfields
|
||||||
|
|
||||||
@ -139,7 +163,8 @@ namespace Gasa
|
|||||||
|
|
||||||
// Works for Unreal 5.4, Win64 MSVC (untested in other scenarios, for now)
|
// Works for Unreal 5.4, Win64 MSVC (untested in other scenarios, for now)
|
||||||
inline
|
inline
|
||||||
void Log( FString Message, EGasaVerbosity Verbosity = EGasaVerbosity::Log
|
void Log( FString Message
|
||||||
|
, EGasaVerbosity Verbosity = EGasaVerbosity::Log
|
||||||
, FLogCategoryBase& Category = LogGasa
|
, FLogCategoryBase& Category = LogGasa
|
||||||
, bool DumpStack = false
|
, bool DumpStack = false
|
||||||
, int32 Line = __builtin_LINE()
|
, int32 Line = __builtin_LINE()
|
||||||
|
0
Project/Source/Gasa/GasaContainers.cpp
Normal file
0
Project/Source/Gasa/GasaContainers.cpp
Normal file
22
Project/Source/Gasa/GasaContainers.h
Normal file
22
Project/Source/Gasa/GasaContainers.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "GasaCommon.h"
|
||||||
|
|
||||||
|
template<typename RowType>
|
||||||
|
inline
|
||||||
|
RowType* GetDataTableRowByTag(UDataTable* DT, FGameplayTag& Tag)
|
||||||
|
{
|
||||||
|
RowType* Row = DT->FindRow<RowType>(Tag.GetTagName(), TEXT(""));
|
||||||
|
return Row;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename KeyType, typename ValueType>
|
||||||
|
inline
|
||||||
|
void RemoveKeys(TMap<KeyType, ValueType> Map, TArray<KeyType> Keys)
|
||||||
|
{
|
||||||
|
for (KeyType& Key : Keys )
|
||||||
|
{
|
||||||
|
Map.Remove(Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,11 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
#include "Engine/DeveloperSettings.h"
|
#include "Engine/DeveloperSettings.h"
|
||||||
|
|
||||||
#include "GasaCommon.h"
|
#include "GasaCommon.h"
|
||||||
|
|
||||||
#include "GasaDevOptions.generated.h"
|
#include "GasaDevOptions.generated.h"
|
||||||
|
|
||||||
|
|
||||||
UCLASS(Config=Game, DefaultConfig, meta=(DisplayName="Gasa"))
|
UCLASS(Config=Game, DefaultConfig, meta=(DisplayName="Gasa"))
|
||||||
class GASA_API UGasaDevOptions : public UDeveloperSettings
|
class GASA_API UGasaDevOptions : public UDeveloperSettings
|
||||||
{
|
{
|
||||||
@ -15,6 +16,9 @@ public:
|
|||||||
// NOTE(Ed): Any Soft-References must have their includes defined in GasaDevOptions.cpp
|
// NOTE(Ed): Any Soft-References must have their includes defined in GasaDevOptions.cpp
|
||||||
// They are used by GasaGen for the GasaDevOptionsCache
|
// They are used by GasaGen for the GasaDevOptionsCache
|
||||||
|
|
||||||
|
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI")
|
||||||
|
TSoftObjectPtr<UDataTable> TaggedMessageTable;
|
||||||
|
|
||||||
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI")
|
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category="UI")
|
||||||
TSoftClassPtr<ACameraMount> Template_PlayerCamera;
|
TSoftClassPtr<ACameraMount> Template_PlayerCamera;
|
||||||
|
|
||||||
|
@ -11,6 +11,9 @@ void FGasaDevOptionsCache::CachedDevOptions()
|
|||||||
{
|
{
|
||||||
UGasaDevOptions* DevOpts = GetMutDevOptions();
|
UGasaDevOptions* DevOpts = GetMutDevOptions();
|
||||||
|
|
||||||
|
TaggedMessageTable = DevOpts->TaggedMessageTable.LoadSynchronous();
|
||||||
|
ensureMsgf( TaggedMessageTable != nullptr, TEXT( "TaggedMessageTable is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" ) );
|
||||||
|
|
||||||
Template_PlayerCamera = DevOpts->Template_PlayerCamera.LoadSynchronous();
|
Template_PlayerCamera = DevOpts->Template_PlayerCamera.LoadSynchronous();
|
||||||
ensureMsgf(
|
ensureMsgf(
|
||||||
Template_PlayerCamera != nullptr, TEXT( "Template_PlayerCamera is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" )
|
Template_PlayerCamera != nullptr, TEXT( "Template_PlayerCamera is null, DO NOT RUN PIE or else you may get a crash if not handled in BP or C++" )
|
||||||
|
@ -8,6 +8,8 @@ struct GASA_API FGasaDevOptionsCache
|
|||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY()
|
||||||
|
UObject* TaggedMessageTable;
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
UClass* Template_PlayerCamera;
|
UClass* Template_PlayerCamera;
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
|
@ -14,12 +14,15 @@ void AGasaHUD::InitHostWidget(FWidgetControllerData const* WidgetControllerData)
|
|||||||
HostWidgetController = NewObject<UHostWidgetController>(this, GetDevOptions()->Template_HostWidgetController.Get());
|
HostWidgetController = NewObject<UHostWidgetController>(this, GetDevOptions()->Template_HostWidgetController.Get());
|
||||||
HostWidgetController->Data = (* WidgetControllerData);
|
HostWidgetController->Data = (* WidgetControllerData);
|
||||||
HostWidget->SetWidgetController(HostWidgetController);
|
HostWidget->SetWidgetController(HostWidgetController);
|
||||||
HostWidgetController->BindCallbacksToDependencies();
|
|
||||||
|
|
||||||
HostWidgetController->BroadcastInitialValues();
|
HostWidgetController->BroadcastInitialValues();
|
||||||
HostWidget->AddToViewport();
|
HostWidget->AddToViewport();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AGasaHUD::DrawHUD()
|
||||||
|
{
|
||||||
|
Super::DrawHUD();
|
||||||
|
}
|
||||||
|
|
||||||
#pragma region HUD
|
#pragma region HUD
|
||||||
void AGasaHUD::ShowHUD()
|
void AGasaHUD::ShowHUD()
|
||||||
{
|
{
|
||||||
@ -32,4 +35,9 @@ void AGasaHUD::BeginPlay()
|
|||||||
{
|
{
|
||||||
Super::BeginPlay();
|
Super::BeginPlay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AGasaHUD::Tick(float DeltaSeconds)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaSeconds);
|
||||||
|
}
|
||||||
#pragma endregion Actor
|
#pragma endregion Actor
|
||||||
|
@ -22,10 +22,13 @@ public:
|
|||||||
void InitHostWidget(FWidgetControllerData const* WidgetControllerData);
|
void InitHostWidget(FWidgetControllerData const* WidgetControllerData);
|
||||||
|
|
||||||
#pragma region HUD
|
#pragma region HUD
|
||||||
|
void DrawHUD() override;
|
||||||
void ShowHUD() override;
|
void ShowHUD() override;
|
||||||
#pragma endregion HUD
|
#pragma endregion HUD
|
||||||
|
|
||||||
#pragma region Actor
|
#pragma region Actor
|
||||||
void BeginPlay() override;
|
void BeginPlay() override;
|
||||||
|
|
||||||
|
void Tick(float DeltaSeconds) override;
|
||||||
#pragma endregion Actor
|
#pragma endregion Actor
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include "GasaUserWidget.h"
|
#include "GasaUserWidget.h"
|
||||||
|
|
||||||
#include "Blueprint/WidgetBlueprintGeneratedClass.h"
|
#include "Blueprint/WidgetBlueprintGeneratedClass.h"
|
||||||
#include "Blueprint/WidgetTree.h"
|
#include "Blueprint/WidgetTree.h"
|
||||||
@ -227,7 +227,7 @@ bool UGasaUserWidget::Initialize()
|
|||||||
|
|
||||||
// For backward compatibility, run the initialize event on widget that doesn't have a player context only when the class authorized it.
|
// For backward compatibility, run the initialize event on widget that doesn't have a player context only when the class authorized it.
|
||||||
bool bClassWantsToRunInitialized = BGClass && BGClass->bCanCallInitializedWithoutPlayerContext;
|
bool bClassWantsToRunInitialized = BGClass && BGClass->bCanCallInitializedWithoutPlayerContext;
|
||||||
if (!IsDesignTime() && (PlayerContext.IsValid() || bClassWantsToRunInitialized))
|
if (!IsDesignTime() && (GetPlayerContext().IsValid() || bClassWantsToRunInitialized))
|
||||||
{
|
{
|
||||||
NativeOnInitialized();
|
NativeOnInitialized();
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include "GlobeProgressBar.h"
|
#include "GlobeProgressBar.h"
|
||||||
|
|
||||||
#include "GasaImage.h"
|
#include "GasaImage.h"
|
||||||
#include "GasaOverlay.h"
|
#include "GasaOverlay.h"
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
#include "AbilitySystem/GasaAbilitySystemComponent_Inlines.h"
|
#include "AbilitySystem/GasaAbilitySystemComponent_Inlines.h"
|
||||||
#include "AbilitySystem/GasaAttributeSet.h"
|
#include "AbilitySystem/GasaAttributeSet.h"
|
||||||
#include "GameplayEffectTypes.h"
|
#include "GameplayEffectTypes.h"
|
||||||
|
#include "GasaDevOptions.h"
|
||||||
|
#include "TaggedMessageRow.h"
|
||||||
|
using namespace Gasa;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -30,6 +33,20 @@ void UHostWidgetController::MaxManaChanged( FOnAttributeChangeData const& Attrib
|
|||||||
}
|
}
|
||||||
#pragma endregion Attribute Changed Callbacks
|
#pragma endregion Attribute Changed Callbacks
|
||||||
|
|
||||||
|
void UHostWidgetController::OnEffectAppliedAssetTags( FGameplayTagContainer const& AssetTags )
|
||||||
|
{
|
||||||
|
UDataTable* TaggedMessages = GetDevOptions()->TaggedMessageTable.Get();
|
||||||
|
for ( FGameplayTag const& Tag : AssetTags )
|
||||||
|
{
|
||||||
|
FGameplayTag MessageTagCategory = FGameplayTag::RequestGameplayTag( FName( "Message" ) );
|
||||||
|
if ( ! Tag.MatchesTag( MessageTagCategory ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
FTaggedMessageRow* Row = TaggedMessages->FindRow<FTaggedMessageRow>( Tag.GetTagName(), TEXT( "" ) );
|
||||||
|
OnTaggedAssetMessage.Broadcast( *Row );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void UHostWidgetController::BroadcastInitialValues()
|
void UHostWidgetController::BroadcastInitialValues()
|
||||||
{
|
{
|
||||||
// This function is managed by: GenGasa/GenGasa_HostWidgetController.cpp
|
// This function is managed by: GenGasa/GenGasa_HostWidgetController.cpp
|
||||||
@ -66,4 +83,6 @@ void UHostWidgetController::BindCallbacksToDependencies()
|
|||||||
FOnGameplayAttributeValueChange& MaxManaAttributeChangedDelegate =
|
FOnGameplayAttributeValueChange& MaxManaAttributeChangedDelegate =
|
||||||
AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetMaxManaAttribute() );
|
AbilitySystem->GetGameplayAttributeValueChangeDelegate( GasaAttribs->GetMaxManaAttribute() );
|
||||||
MaxManaAttributeChangedDelegate.AddUObject( this, &ThisClass::MaxManaChanged );
|
MaxManaAttributeChangedDelegate.AddUObject( this, &ThisClass::MaxManaChanged );
|
||||||
|
|
||||||
|
AbilitySystem->Event_OnEffectAppliedAssetTags.AddUObject( this, &UHostWidgetController::OnEffectAppliedAssetTags );
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "GasaCommon.h"
|
||||||
|
#include "TaggedMessageRow.h"
|
||||||
#include "WidgetController.h"
|
#include "WidgetController.h"
|
||||||
#include "HostWidgetController.generated.h"
|
#include "HostWidgetController.generated.h"
|
||||||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam( FAttributeFloatChangedSig, float, NewValue );
|
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam( FAttributeChangedSig, float, NewValue );
|
||||||
|
|
||||||
UCLASS( Blueprintable, BlueprintType )
|
UCLASS( Blueprintable, BlueprintType )
|
||||||
class GASA_API UHostWidgetController : public UWidgetController
|
class GASA_API UHostWidgetController : public UWidgetController
|
||||||
@ -13,16 +16,16 @@ public:
|
|||||||
// Attribute Events are generated by GasaGen/GasaGen_HostWidgetController.cpp
|
// Attribute Events are generated by GasaGen/GasaGen_HostWidgetController.cpp
|
||||||
|
|
||||||
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
||||||
FAttributeFloatChangedSig Event_OnHealthChanged;
|
FAttributeChangedSig Event_OnHealthChanged;
|
||||||
|
|
||||||
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
||||||
FAttributeFloatChangedSig Event_OnMaxHealthChanged;
|
FAttributeChangedSig Event_OnMaxHealthChanged;
|
||||||
|
|
||||||
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
||||||
FAttributeFloatChangedSig Event_OnManaChanged;
|
FAttributeChangedSig Event_OnManaChanged;
|
||||||
|
|
||||||
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
UPROPERTY( BlueprintAssignable, Category = "Attributes" )
|
||||||
FAttributeFloatChangedSig Event_OnMaxManaChanged;
|
FAttributeChangedSig Event_OnMaxManaChanged;
|
||||||
|
|
||||||
void HealthChanged( FOnAttributeChangeData const& Data );
|
void HealthChanged( FOnAttributeChangeData const& Data );
|
||||||
void MaxHealthChanged( FOnAttributeChangeData const& Data );
|
void MaxHealthChanged( FOnAttributeChangeData const& Data );
|
||||||
@ -30,6 +33,11 @@ public:
|
|||||||
void MaxManaChanged( FOnAttributeChangeData const& Data );
|
void MaxManaChanged( FOnAttributeChangeData const& Data );
|
||||||
#pragma endregion Attribute Events
|
#pragma endregion Attribute Events
|
||||||
|
|
||||||
|
UPROPERTY( BlueprintAssignable, Category = "Messages" )
|
||||||
|
FTaggedMessageRowSig OnTaggedAssetMessage;
|
||||||
|
|
||||||
|
void OnEffectAppliedAssetTags( FGameplayTagContainer const& AssetTags );
|
||||||
|
|
||||||
#pragma region WidgetController
|
#pragma region WidgetController
|
||||||
void BroadcastInitialValues() override;
|
void BroadcastInitialValues() override;
|
||||||
void BindCallbacksToDependencies() override;
|
void BindCallbacksToDependencies() override;
|
||||||
|
28
Project/Source/Gasa/UI/TaggedMessageRow.h
Normal file
28
Project/Source/Gasa/UI/TaggedMessageRow.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "GameplayTagContainer.h"
|
||||||
|
#include "GasaCommon.h"
|
||||||
|
#include "Engine/DataTable.h"
|
||||||
|
#include "Templates/SubclassOf.h"
|
||||||
|
|
||||||
|
#include "TaggedMessageRow.generated.h"
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FTaggedMessageRow : public FTableRowBase
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly)
|
||||||
|
FGameplayTag Tag;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly)
|
||||||
|
FText Message;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly)
|
||||||
|
TSubclassOf<UGasaUserWidget> MessageTemplate;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadOnly)
|
||||||
|
UTexture2D* Image;
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FTaggedMessageRowSig, FTaggedMessageRow, Message);
|
@ -77,6 +77,9 @@ CodeBody parse_file( char const* path ) {
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// inline
|
||||||
|
// CodeConstructor find_constructor( StrC parent_name, )
|
||||||
|
|
||||||
inline
|
inline
|
||||||
void format_file( char const* path )
|
void format_file( char const* path )
|
||||||
{
|
{
|
||||||
|
@ -4,11 +4,12 @@
|
|||||||
#include "gen.hpp"
|
#include "gen.hpp"
|
||||||
#include "gen.builder.hpp"
|
#include "gen.builder.hpp"
|
||||||
#include "GasaGenCommon.cpp"
|
#include "GasaGenCommon.cpp"
|
||||||
|
#include "GasaGen_UGasaAttributeSet.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void gen_UHostWidgetController()
|
void gen_UHostWidgetController()
|
||||||
{
|
{
|
||||||
Array<StringCached> attribute_fields = get_gasa_attribute_fields();
|
Array<GAS_AttributeEntry> attribute_fields = get_gasa_attribute_fields();
|
||||||
|
|
||||||
CodeBody ori_HostWidgetController_header = parse_file(path_gasa_ui "HostWidgetController.h");
|
CodeBody ori_HostWidgetController_header = parse_file(path_gasa_ui "HostWidgetController.h");
|
||||||
{
|
{
|
||||||
@ -64,21 +65,21 @@ void gen_UHostWidgetController()
|
|||||||
|
|
||||||
for ( s32 id = 0; id < attribute_fields.num(); ++id )
|
for ( s32 id = 0; id < attribute_fields.num(); ++id )
|
||||||
{
|
{
|
||||||
StringCached attribute_field = attribute_fields[id];
|
GAS_AttributeEntry attribute_field = attribute_fields[id];
|
||||||
|
|
||||||
attribute_events.append( code_str(
|
attribute_events.append( code_str(
|
||||||
UPROPERTY(BlueprintAssignable, Category = "Attributes")
|
UPROPERTY(BlueprintAssignable, Category = "Attributes")
|
||||||
));
|
));
|
||||||
attribute_events.append(fmt_newline);
|
attribute_events.append(fmt_newline);
|
||||||
attribute_events.append( parse_variable(
|
attribute_events.append( parse_variable(
|
||||||
token_fmt( "field", (StrC) attribute_field, stringize( FAttributeFloatChangedSig Event_On<field>Changed; ))
|
token_fmt( "field", (StrC) attribute_field.Name, stringize( FAttributeChangedSig Event_On<field>Changed; ))
|
||||||
));
|
));
|
||||||
attribute_events.append(fmt_newline);
|
attribute_events.append(fmt_newline);
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( s32 id = 0; id < attribute_fields.num(); ++id )
|
for ( s32 id = 0; id < attribute_fields.num(); ++id )
|
||||||
{
|
{
|
||||||
StringCached attribute_field = attribute_fields[id];
|
StringCached attribute_field = attribute_fields[id].Name;
|
||||||
|
|
||||||
attribute_events.append( parse_function(
|
attribute_events.append( parse_function(
|
||||||
token_fmt( "field", (StrC) attribute_field, stringize( void <field>Changed(FOnAttributeChangeData const& Data); ))
|
token_fmt( "field", (StrC) attribute_field, stringize( void <field>Changed(FOnAttributeChangeData const& Data); ))
|
||||||
@ -154,9 +155,9 @@ void gen_UHostWidgetController()
|
|||||||
CodeFn BroadcastInitialValues = NoCode;
|
CodeFn BroadcastInitialValues = NoCode;
|
||||||
{
|
{
|
||||||
CodeBody broadcast_calls = def_body(ECode::Function_Body);
|
CodeBody broadcast_calls = def_body(ECode::Function_Body);
|
||||||
for (StringCached field : attribute_fields)
|
for (GAS_AttributeEntry field : attribute_fields)
|
||||||
{
|
{
|
||||||
broadcast_calls.append( code_fmt( "field", (StrC)field,
|
broadcast_calls.append( code_fmt( "field", (StrC)field.Name,
|
||||||
stringize( Event_On<field>Changed.Broadcast( GasaAttribs->Get<field>() ); )
|
stringize( Event_On<field>Changed.Broadcast( GasaAttribs->Get<field>() ); )
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -185,9 +186,9 @@ void gen_UHostWidgetController()
|
|||||||
CodeBody bindings = def_body(ECode::Function_Body);
|
CodeBody bindings = def_body(ECode::Function_Body);
|
||||||
bindings.append(fmt_newline);
|
bindings.append(fmt_newline);
|
||||||
bindings.append(fmt_newline);
|
bindings.append(fmt_newline);
|
||||||
for (StringCached field : attribute_fields)
|
for (GAS_AttributeEntry field : attribute_fields)
|
||||||
{
|
{
|
||||||
bindings.append( code_fmt( "field", (StrC)field,
|
bindings.append( code_fmt( "field", (StrC)field.Name,
|
||||||
stringize(
|
stringize(
|
||||||
FOnGameplayAttributeValueChange& <field>AttributeChangedDelegate = AbilitySystem->GetGameplayAttributeValueChangeDelegate(GasaAttribs->Get<field>Attribute());
|
FOnGameplayAttributeValueChange& <field>AttributeChangedDelegate = AbilitySystem->GetGameplayAttributeValueChangeDelegate(GasaAttribs->Get<field>Attribute());
|
||||||
<field>AttributeChangedDelegate.AddUObject(this, &ThisClass::<field>Changed);
|
<field>AttributeChangedDelegate.AddUObject(this, &ThisClass::<field>Changed);
|
||||||
@ -208,6 +209,8 @@ void gen_UHostWidgetController()
|
|||||||
UGasaAttributeSet* GasaAttribs = Cast<UGasaAttributeSet>( Data.Attributes );
|
UGasaAttributeSet* GasaAttribs = Cast<UGasaAttributeSet>( Data.Attributes );
|
||||||
|
|
||||||
<bindings>
|
<bindings>
|
||||||
|
|
||||||
|
AbilitySystem->Event_OnEffectAppliedAssetTags.AddUObject(this, & UHostWidgetController::OnEffectAppliedAssetTags);
|
||||||
})
|
})
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -219,7 +222,7 @@ void gen_UHostWidgetController()
|
|||||||
|
|
||||||
for ( s32 id = 0; id < attribute_fields.num(); )
|
for ( s32 id = 0; id < attribute_fields.num(); )
|
||||||
{
|
{
|
||||||
StringCached attribute_field = attribute_fields[id];
|
StringCached attribute_field = attribute_fields[id].Name;
|
||||||
|
|
||||||
attribute_callbacks.append( parse_function( token_fmt(
|
attribute_callbacks.append( parse_function( token_fmt(
|
||||||
"field", (StrC) attribute_field,
|
"field", (StrC) attribute_field,
|
||||||
|
@ -7,25 +7,44 @@
|
|||||||
#include "GasaGenCommon.cpp"
|
#include "GasaGenCommon.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void def_attribute_properties ( CodeBody body, Array<StringCached> properties );
|
struct GAS_AttributeEntry
|
||||||
void def_attribute_field_on_reps ( CodeBody body, Array<StringCached> properties );
|
{
|
||||||
void def_attribute_field_property_getters ( CodeBody body, StrC class_name, Array<StringCached> properties );
|
StringCached Name;
|
||||||
void def_attribute_field_value_getters ( CodeBody body, Array<StringCached> properties );
|
StringCached MinName;
|
||||||
void def_attribute_field_value_setters ( CodeBody body, Array<StringCached> properties );
|
StringCached MaxName;
|
||||||
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<StringCached> properties );
|
float Min;
|
||||||
void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties );
|
float Max;
|
||||||
void impl_attribute_fields ( CodeBody body, StrC class_name, Array<StringCached> properties );
|
};
|
||||||
|
|
||||||
Array<StringCached> get_gasa_attribute_fields()
|
void def_attribute_properties ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
||||||
|
void def_attribute_field_on_reps ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
||||||
|
void def_attribute_field_property_getters ( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties );
|
||||||
|
void def_attribute_field_value_getters ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
||||||
|
void def_attribute_field_value_setters ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
||||||
|
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties );
|
||||||
|
void def_attribute_field_initers ( CodeBody body, Array<GAS_AttributeEntry> properties );
|
||||||
|
void impl_attribute_fields ( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties );
|
||||||
|
|
||||||
|
Array<GAS_AttributeEntry> get_gasa_attribute_fields()
|
||||||
{
|
{
|
||||||
local_persist
|
local_persist
|
||||||
Array<StringCached> attribute_fields = Array<StringCached>::init_reserve(GlobalAllocator, 64);
|
Array<GAS_AttributeEntry> attribute_fields = Array<GAS_AttributeEntry>::init_reserve(GlobalAllocator, 64);
|
||||||
|
|
||||||
for (local_persist s32 do_once = 0; do_once == 0; ++ do_once) {
|
for (local_persist s32 do_once = 0; do_once == 0; ++ do_once) {
|
||||||
attribute_fields.append( get_cached_string(txt("Health")));
|
StringCached str_Health = get_cached_string(txt("Health"));
|
||||||
attribute_fields.append( get_cached_string(txt("MaxHealth")));
|
StringCached str_MaxHealth = get_cached_string(txt("MaxHealth"));
|
||||||
attribute_fields.append( get_cached_string(txt("Mana")));
|
StringCached str_Mana = get_cached_string(txt("Mana"));
|
||||||
attribute_fields.append( get_cached_string(txt("MaxMana")));
|
StringCached str_MaxMana = get_cached_string(txt("MaxMana"));
|
||||||
|
|
||||||
|
GAS_AttributeEntry Health = { str_Health, {nullptr}, str_MaxHealth, 0, 100.f };
|
||||||
|
GAS_AttributeEntry MaxHealth = { str_MaxHealth, {nullptr}, {nullptr}, 0, 99999.f };
|
||||||
|
GAS_AttributeEntry Mana = { str_Mana, {nullptr}, str_MaxMana, 0, 50.f };
|
||||||
|
GAS_AttributeEntry MaxMana = { str_MaxMana, {nullptr}, {nullptr}, 0, 99999.f };
|
||||||
|
|
||||||
|
attribute_fields.append(Health);
|
||||||
|
attribute_fields.append(MaxHealth);
|
||||||
|
attribute_fields.append(Mana);
|
||||||
|
attribute_fields.append(MaxMana);
|
||||||
}
|
}
|
||||||
return attribute_fields;
|
return attribute_fields;
|
||||||
}
|
}
|
||||||
@ -35,7 +54,7 @@ void gen_UGasaAttributeSet()
|
|||||||
CodeType type_UAttributeSet = def_type( txt("UAttributeSet") );
|
CodeType type_UAttributeSet = def_type( txt("UAttributeSet") );
|
||||||
CodeComment generation_notice = def_comment(txt("Generated by GasaGen/GasaGen_UGasaAttributeSet.cpp"));
|
CodeComment generation_notice = def_comment(txt("Generated by GasaGen/GasaGen_UGasaAttributeSet.cpp"));
|
||||||
|
|
||||||
Array<StringCached> attribute_fields = get_gasa_attribute_fields();
|
Array<GAS_AttributeEntry> attribute_fields = get_gasa_attribute_fields();
|
||||||
|
|
||||||
StrC class_name = txt("UGasaAttributeSet");
|
StrC class_name = txt("UGasaAttributeSet");
|
||||||
|
|
||||||
@ -57,32 +76,39 @@ void gen_UGasaAttributeSet()
|
|||||||
body.append( UHT_GENERATED_BODY);
|
body.append( UHT_GENERATED_BODY);
|
||||||
body.append( access_public );
|
body.append( access_public );
|
||||||
|
|
||||||
def_attribute_properties( body, attribute_fields);
|
|
||||||
|
|
||||||
body.append(fmt_newline);
|
|
||||||
body.append( def_constructor() );
|
body.append( def_constructor() );
|
||||||
body.append(fmt_newline);
|
body.append(fmt_newline);
|
||||||
|
|
||||||
|
def_attribute_properties( body, attribute_fields);
|
||||||
|
body.append(fmt_newline);
|
||||||
def_attribute_field_on_reps( body, attribute_fields);
|
def_attribute_field_on_reps( body, attribute_fields);
|
||||||
|
|
||||||
body.append(fmt_newline);
|
body.append(fmt_newline);
|
||||||
|
|
||||||
body.append( fmt_newline );
|
body.append( fmt_newline );
|
||||||
body.append( def_pragma(code( region Getters )));
|
body.append( def_pragma(txt( "region Getters" )));
|
||||||
def_attribute_field_property_getters( body, class_name, attribute_fields );
|
def_attribute_field_property_getters( body, class_name, attribute_fields );
|
||||||
body.append( fmt_newline );
|
body.append( fmt_newline );
|
||||||
def_attribute_field_value_getters( body, attribute_fields );
|
def_attribute_field_value_getters( body, attribute_fields );
|
||||||
body.append( def_pragma(code( endregion Getters )));
|
body.append( def_pragma(txt( "endregion Getters" )));
|
||||||
body.append( fmt_newline );
|
body.append( fmt_newline );
|
||||||
|
|
||||||
body.append( def_pragma(code( region Setters )));
|
body.append( def_pragma(txt( "region Setters" )));
|
||||||
def_attribute_field_value_setters( body, attribute_fields );
|
def_attribute_field_value_setters( body, attribute_fields );
|
||||||
body.append( fmt_newline );
|
body.append( fmt_newline );
|
||||||
body.append( fmt_newline );
|
body.append( fmt_newline );
|
||||||
def_attribute_field_initers( body, attribute_fields );
|
def_attribute_field_initers( body, attribute_fields );
|
||||||
body.append( def_pragma(code( endregion Setters )));
|
body.append( def_pragma(txt( "endregion Setters" )));
|
||||||
body.append( fmt_newline );
|
body.append( fmt_newline );
|
||||||
|
|
||||||
|
body.append( def_pragma( txt("region AttributeSet")));
|
||||||
|
body.append( code_str(
|
||||||
|
void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override;
|
||||||
|
void PostGameplayEffectExecute(FGameplayEffectModCallbackData const& Data) override;
|
||||||
|
));
|
||||||
|
body.append( def_pragma( txt("endregion AttributeSet")));
|
||||||
|
body.append(fmt_newline);
|
||||||
|
|
||||||
body.append( def_pragma( txt("region UObject")));
|
body.append( def_pragma( txt("region UObject")));
|
||||||
CodeFn GetLifetimeOfReplicatedProps = parse_function( code(
|
CodeFn GetLifetimeOfReplicatedProps = parse_function( code(
|
||||||
void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
|
void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
|
||||||
@ -144,6 +170,7 @@ void gen_UGasaAttributeSet()
|
|||||||
header.print(fmt_newline);
|
header.print(fmt_newline);
|
||||||
source.print( def_include( txt("GasaAttributeSet.h")));
|
source.print( def_include( txt("GasaAttributeSet.h")));
|
||||||
source.print( def_include( txt("GasaAttributeSet_Inlines.h")));
|
source.print( def_include( txt("GasaAttributeSet_Inlines.h")));
|
||||||
|
source.print( def_include( txt("EffectProperties.h")));
|
||||||
source.print(fmt_newline);
|
source.print(fmt_newline);
|
||||||
source.print( def_include( txt("AbilitySystemComponent.h")));
|
source.print( def_include( txt("AbilitySystemComponent.h")));
|
||||||
source.print( def_include( txt("Net/UnrealNetwork.h")));
|
source.print( def_include( txt("Net/UnrealNetwork.h")));
|
||||||
@ -165,14 +192,68 @@ void gen_UGasaAttributeSet()
|
|||||||
|
|
||||||
impl_attribute_fields( body, class_name, attribute_fields);
|
impl_attribute_fields( body, class_name, attribute_fields);
|
||||||
|
|
||||||
|
Code PostGameplayEffectExecute = parse_function( code(
|
||||||
|
void UGasaAttributeSet::PostGameplayEffectExecute(FGameplayEffectModCallbackData const& Data)
|
||||||
|
{
|
||||||
|
Super::PostGameplayEffectExecute(Data);
|
||||||
|
FEffectProperties Props;
|
||||||
|
Props.Populate(Data);
|
||||||
|
}
|
||||||
|
));
|
||||||
|
body.append(PostGameplayEffectExecute);
|
||||||
|
body.append(fmt_newline);
|
||||||
|
|
||||||
|
CodeFn PreAttributeChange;
|
||||||
|
{
|
||||||
|
CodeBody attribute_clamps = def_body( CodeT::Function_Body );
|
||||||
|
attribute_clamps.append(fmt_newline);
|
||||||
|
attribute_clamps.append(fmt_newline);
|
||||||
|
for (GAS_AttributeEntry field : attribute_fields)
|
||||||
|
{
|
||||||
|
String clamp_min;
|
||||||
|
if (field.MinName.Data)
|
||||||
|
clamp_min = get_cached_string(token_fmt( "MinName", (StrC)field.MinName, "Get<MinName>()"));
|
||||||
|
else
|
||||||
|
clamp_min = String::fmt_buf(GlobalAllocator, "%f", field.Min);
|
||||||
|
|
||||||
|
String clamp_max;
|
||||||
|
if (field.MaxName.Data)
|
||||||
|
clamp_max = get_cached_string(token_fmt( "MaxName", (StrC)field.MaxName, "Get<MaxName>()"));
|
||||||
|
else
|
||||||
|
clamp_max = String::fmt_buf(GlobalAllocator, "%f", field.Max);
|
||||||
|
|
||||||
|
attribute_clamps.append( code_fmt(
|
||||||
|
"field", (StrC)field.Name,
|
||||||
|
"clamp_min", (StrC)clamp_min,
|
||||||
|
"clamp_max", (StrC)clamp_max,
|
||||||
|
stringize(
|
||||||
|
if (Attribute == Get<field>Attribute())
|
||||||
|
{
|
||||||
|
NewValue = FMath::Clamp(NewValue, <clamp_min>, <clamp_max>);
|
||||||
|
}
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
attribute_clamps.append(fmt_newline);
|
||||||
|
attribute_clamps.append(fmt_newline);
|
||||||
|
PreAttributeChange = parse_function( token_fmt( "attribute_clamps", (StrC)attribute_clamps.to_string(), stringize(
|
||||||
|
void UGasaAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
|
||||||
|
{
|
||||||
|
Super::PreAttributeChange(Attribute, NewValue);
|
||||||
|
<attribute_clamps>
|
||||||
|
}
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
body.append(PreAttributeChange);
|
||||||
|
body.append(fmt_newline);
|
||||||
|
|
||||||
CodeFn GetLifetimeOfReplicatedProps;
|
CodeFn GetLifetimeOfReplicatedProps;
|
||||||
{
|
{
|
||||||
CodeBody field_lifetimes = def_body( CodeT::Function_Body);
|
CodeBody field_lifetimes = def_body( CodeT::Function_Body);
|
||||||
field_lifetimes.append(fmt_newline);
|
field_lifetimes.append(fmt_newline);
|
||||||
field_lifetimes.append(fmt_newline);
|
field_lifetimes.append(fmt_newline);
|
||||||
for (StringCached field : attribute_fields)
|
for (GAS_AttributeEntry field : attribute_fields)
|
||||||
{
|
{
|
||||||
field_lifetimes.append( code_fmt( "field", (StrC)field, stringize(
|
field_lifetimes.append( code_fmt( "field", (StrC)field.Name, stringize(
|
||||||
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, <field>);
|
DOREPLIFETIME_DEFAULT_GAS(UGasaAttributeSet, <field>);
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
@ -194,44 +275,39 @@ void gen_UGasaAttributeSet()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void def_attribute_properties( CodeBody body, Array<StringCached> properties )
|
void def_attribute_properties( CodeBody body, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
for ( StringCached property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
Code field_uproperty = code_fmt( "property", (StrC)property, stringize(
|
Code field_uproperty = code_fmt( "property", (StrC)property.Name, stringize(
|
||||||
UPROPERTY(ReplicatedUsing=Client_OnRep_<property>, EditAnywhere, BlueprintReadWrite, Category="Attributes")
|
UPROPERTY(ReplicatedUsing=Client_OnRep_<property>, EditAnywhere, BlueprintReadWrite, Category="Attributes")
|
||||||
|
FGameplayAttributeData <property>;
|
||||||
));
|
));
|
||||||
|
body.append(field_uproperty);
|
||||||
CodeType type_FGameplayAttributeData = def_type( txt("FGameplayAttributeData"));
|
|
||||||
|
|
||||||
body.append(fmt_newline);
|
|
||||||
body.append( field_uproperty );
|
|
||||||
body.append(fmt_newline);
|
|
||||||
body.append( def_variable( type_FGameplayAttributeData, StrC(property)) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void def_attribute_field_on_reps( CodeBody body, Array<StringCached> properties )
|
void def_attribute_field_on_reps( CodeBody body, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
for ( StringCached property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
Code umeta_UFUNCTION = code_str( UFUNCTION() );
|
Code umeta_UFUNCTION = code_str( UFUNCTION() );
|
||||||
|
|
||||||
body.append(fmt_newline);
|
body.append(fmt_newline);
|
||||||
body.append( umeta_UFUNCTION );
|
body.append( umeta_UFUNCTION );
|
||||||
body.append(fmt_newline);
|
body.append(fmt_newline);
|
||||||
body.append( code_fmt( "property", (StrC)property, stringize(
|
body.append( code_fmt( "property", (StrC)property.Name, stringize(
|
||||||
void Client_OnRep_<property>(FGameplayAttributeData& Prev<property>);
|
void Client_OnRep_<property>(FGameplayAttributeData& Prev<property>);
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array<StringCached> properties )
|
void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
for ( String property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
CodeFn generated_get_attribute = parse_function(
|
CodeFn generated_get_attribute = parse_function(
|
||||||
token_fmt( "class_name", class_name, "property", (StrC)property,
|
token_fmt( "class_name", class_name, "property", (StrC)property.Name,
|
||||||
stringize(
|
stringize(
|
||||||
static FGameplayAttribute Get<property>Attribute()
|
static FGameplayAttribute Get<property>Attribute()
|
||||||
{
|
{
|
||||||
@ -245,11 +321,11 @@ void def_attribute_field_property_getters( CodeBody body, StrC class_name, Array
|
|||||||
|
|
||||||
#pragma push_macro("FORCEINLINE")
|
#pragma push_macro("FORCEINLINE")
|
||||||
#undef FORCEINLINE
|
#undef FORCEINLINE
|
||||||
void def_attribute_field_value_getters( CodeBody body, Array<StringCached> properties )
|
void def_attribute_field_value_getters( CodeBody body, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
for ( String property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
body.append( code_fmt( "property", (StrC)property,
|
body.append( code_fmt( "property", (StrC)property.Name,
|
||||||
stringize(
|
stringize(
|
||||||
FORCEINLINE float Get<property>() const
|
FORCEINLINE float Get<property>() const
|
||||||
{
|
{
|
||||||
@ -259,24 +335,24 @@ void def_attribute_field_value_getters( CodeBody body, Array<StringCached> prope
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void def_attribute_field_value_setters( CodeBody body, Array<StringCached> properties )
|
void def_attribute_field_value_setters( CodeBody body, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
for ( String property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
body.append( code_fmt( "property", (StrC)property,
|
body.append( code_fmt( "property", (StrC)property.Name,
|
||||||
stringize(
|
stringize(
|
||||||
FORCEINLINE void Set<property>(float NewVal);
|
FORCEINLINE void Set<property>(float NewVal);
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<StringCached> properties )
|
void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
body.append(def_pragma( txt("region Attribute Setters")));
|
body.append(def_pragma( txt("region Attribute Setters")));
|
||||||
for ( String property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
CodeFn generated_get_attribute = parse_function(
|
CodeFn generated_get_attribute = parse_function(
|
||||||
token_fmt( "class_name", class_name, "property", (StrC)property,
|
token_fmt( "class_name", class_name, "property", (StrC)property.Name,
|
||||||
stringize(
|
stringize(
|
||||||
FORCEINLINE void <class_name>::Set<property>(float NewVal)
|
FORCEINLINE void <class_name>::Set<property>(float NewVal)
|
||||||
{
|
{
|
||||||
@ -292,11 +368,11 @@ void def_attribute_field_property_setter_inlines( CodeBody body, StrC class_name
|
|||||||
body.append(def_pragma( txt("endregion Attribute Setters")));
|
body.append(def_pragma( txt("endregion Attribute Setters")));
|
||||||
}
|
}
|
||||||
|
|
||||||
void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties )
|
void def_attribute_field_initers ( CodeBody body, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
for ( String property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
body.append( code_fmt( "property", (StrC)property,
|
body.append( code_fmt( "property", (StrC)property.Name,
|
||||||
stringize(
|
stringize(
|
||||||
FORCEINLINE void Init<property>(float NewVal)
|
FORCEINLINE void Init<property>(float NewVal)
|
||||||
{
|
{
|
||||||
@ -307,14 +383,14 @@ void def_attribute_field_initers ( CodeBody body, Array<StringCached> properties
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void impl_attribute_fields( CodeBody body, StrC class_name, Array<StringCached> properties )
|
void impl_attribute_fields( CodeBody body, StrC class_name, Array<GAS_AttributeEntry> properties )
|
||||||
{
|
{
|
||||||
body.append(fmt_newline);
|
body.append(fmt_newline);
|
||||||
body.append(def_pragma( txt("region Rep Notifies")));
|
body.append(def_pragma( txt("region Rep Notifies")));
|
||||||
for ( String property : properties )
|
for ( GAS_AttributeEntry property : properties )
|
||||||
{
|
{
|
||||||
CodeFn field_impl = parse_function( token_fmt(
|
CodeFn field_impl = parse_function( token_fmt(
|
||||||
"class_name", class_name, "property", (StrC)property, "from_notice", txt("\n// From GAMEPLAYATTRIBUTE_REPNOTIFY\n"),
|
"class_name", class_name, "property", (StrC)property.Name, "from_notice", txt("\n// From GAMEPLAYATTRIBUTE_REPNOTIFY\n"),
|
||||||
stringize(
|
stringize(
|
||||||
void <class_name>::Client_OnRep_<property>(FGameplayAttributeData& Prev<property>)
|
void <class_name>::Client_OnRep_<property>(FGameplayAttributeData& Prev<property>)
|
||||||
{
|
{
|
||||||
|
83
scripts/clean_shit_up.ps1
Normal file
83
scripts/clean_shit_up.ps1
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
# PowerShell script to set up Git LFS for Content directory
|
||||||
|
clear-host
|
||||||
|
|
||||||
|
$path_scripts = $PSScriptRoot
|
||||||
|
$path_helpers = join-path $path_scripts 'helpers'
|
||||||
|
$path_root = split-path -Parent -Path $path_scripts
|
||||||
|
$path_ue = join-path '../../Surgo' 'UE'
|
||||||
|
$path_project = join-path $path_root 'Project'
|
||||||
|
|
||||||
|
|
||||||
|
# Set your repository paths here
|
||||||
|
$path_content = join-path $path_project 'Content'
|
||||||
|
|
||||||
|
|
||||||
|
# Function to remove Content directory from Git history
|
||||||
|
function Remove-ContentFromGitHistory {
|
||||||
|
push-location $path_repo
|
||||||
|
|
||||||
|
$cgit_filter_branch = 'filter-branch'
|
||||||
|
$cgit_for_each_ref = 'for-each-ref'
|
||||||
|
$cgit_update_ref = 'update-ref'
|
||||||
|
$cgit_reflog_expire = 'reflog expire'
|
||||||
|
$cgit_garbage_collect = 'gc'
|
||||||
|
|
||||||
|
$fgit_agressive = '--aggressive'
|
||||||
|
$fgit_all = '--all'
|
||||||
|
$fgit_cached = '--cached'
|
||||||
|
$fgit_format = '--format'
|
||||||
|
$fgit_expire_now = '--expire=now'
|
||||||
|
$fgit_ignore_unmatch = '--ignore-unmatch'
|
||||||
|
$fgit_index_filter = '--index-filter'
|
||||||
|
$fgit_force = '--force'
|
||||||
|
$fgit_prune_empty = '--prune-empty'
|
||||||
|
$fgit_prune_now = '--prune=now'
|
||||||
|
$fgit_tag_name_filter = '--tag-name-filter'
|
||||||
|
$fgit_stdin = '--stdin'
|
||||||
|
|
||||||
|
$fgit_filter_concat = 'cat'
|
||||||
|
$fgit_filter_separate = '--'
|
||||||
|
|
||||||
|
$fmt_delete_refs = 'delete $(refname)'
|
||||||
|
$original_refs = 'refs/original'
|
||||||
|
|
||||||
|
$filter_cmd = 'git rm -r --cached'
|
||||||
|
|
||||||
|
# Construct filter-branch command
|
||||||
|
$filter_branch_args = @()
|
||||||
|
$filter_branch_args += $fgit_force
|
||||||
|
$filter_branch_args += $fgit_index_filter
|
||||||
|
$filter_branch_args += "git rm -r $fgit_cached $fgit_ignore_unmatch $path_content"
|
||||||
|
$filter_branch_args += $fgit_prune_empty
|
||||||
|
$filter_branch_args += $fgit_tag_name_filter
|
||||||
|
$filter_branch_args += $fgit_filter_concat
|
||||||
|
$filter_branch_args += $fgit_filter_separate
|
||||||
|
$filter_branch_args += $fgit_all
|
||||||
|
|
||||||
|
# Execute filter-branch command
|
||||||
|
& git $cgit_filter_branch $filter_branch_args
|
||||||
|
|
||||||
|
# Construct for-each-ref command
|
||||||
|
$for_each_ref_args = @()
|
||||||
|
$for_each_ref_args += "$fgit_format='$fmt_delete_refs'"
|
||||||
|
$for_each_ref_args += $original_refs
|
||||||
|
|
||||||
|
# Execute for-each-ref and pipe to update-ref
|
||||||
|
$refs_to_delete = & git $cgit_for_each_ref $for_each_ref_args
|
||||||
|
$refs_to_delete | & git $cgit_update_ref $fgit_stdin
|
||||||
|
|
||||||
|
# Construct and execute reflog expire command
|
||||||
|
$reflog_expire_args = @()
|
||||||
|
$reflog_expire_args += $fgit_expire_now
|
||||||
|
$reflog_expire_args += $fgit_all
|
||||||
|
& git $cgit_reflog_expire $reflog_expire_args
|
||||||
|
|
||||||
|
# Construct and execute garbage collect command
|
||||||
|
$gc_args = @()
|
||||||
|
$gc_args += $fgit_prune_now
|
||||||
|
$gc_args += $fgit_aggressive
|
||||||
|
& git $cgit_garbage_collect $gc_args
|
||||||
|
|
||||||
|
pop-location
|
||||||
|
}
|
||||||
|
Remove-ContentFromGitHistory
|
@ -54,7 +54,7 @@ elseif ( $release -eq $false ) {
|
|||||||
else {
|
else {
|
||||||
$optimize = $true
|
$optimize = $true
|
||||||
}
|
}
|
||||||
|
#endregion Configuration
|
||||||
|
|
||||||
. $vendor_toolchain
|
. $vendor_toolchain
|
||||||
. $incremental_checks
|
. $incremental_checks
|
||||||
@ -103,3 +103,4 @@ function run-gengasa
|
|||||||
Pop-Location
|
Pop-Location
|
||||||
}
|
}
|
||||||
run-gengasa
|
run-gengasa
|
||||||
|
#endregion Building
|
||||||
|
@ -55,6 +55,21 @@
|
|||||||
</Expand>
|
</Expand>
|
||||||
</Type>
|
</Type>
|
||||||
|
|
||||||
|
<Type Name="gen::StringCached">
|
||||||
|
<DisplayString Condition="Data == nullptr">null</DisplayString>
|
||||||
|
<DisplayString>{Data,na}</DisplayString>
|
||||||
|
<Expand>
|
||||||
|
<Synthetic Name="Header">
|
||||||
|
<DisplayString>{(Header*)((char*)Data - sizeof(Header))}</DisplayString>
|
||||||
|
<Expand>
|
||||||
|
<Item Name="Allocator">((Header*)((char*)Data - sizeof(Header)))->Allocator</Item>
|
||||||
|
<Item Name="Capacity">((Header*)((char*)Data - sizeof(Header)))->Capacity</Item>
|
||||||
|
<Item Name="Length">((Header*)((char*)Data - sizeof(Header)))->Length</Item>
|
||||||
|
</Expand>
|
||||||
|
</Synthetic>
|
||||||
|
</Expand>
|
||||||
|
</Type>
|
||||||
|
|
||||||
<Type Name="gen::String::Header">
|
<Type Name="gen::String::Header">
|
||||||
<DisplayString>Length: {Length}, Capacity: {Capacity}</DisplayString>
|
<DisplayString>Length: {Length}, Capacity: {Capacity}</DisplayString>
|
||||||
<Expand>
|
<Expand>
|
||||||
|
4
scripts/setup_content.ps1
Normal file
4
scripts/setup_content.ps1
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
clear-host
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user