diff --git a/Content/Enemy/BP_EnemyCharacter.uasset b/Content/Enemy/BP_EnemyCharacter.uasset index f1340c7..35999ac 100644 --- a/Content/Enemy/BP_EnemyCharacter.uasset +++ b/Content/Enemy/BP_EnemyCharacter.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e91cfc30febc3ae71c2e1d1628707da0de9eb34b6636149d7d240961160176e7 -size 23929 +oid sha256:c1dad231c189bc7f487759dff6ede49d68d5dac32d88ab95504098b9b7a2f595 +size 23678 diff --git a/Content/Enemy/BP_TestEnemy.uasset b/Content/Enemy/BP_TestEnemy.uasset new file mode 100644 index 0000000..a987d70 --- /dev/null +++ b/Content/Enemy/BP_TestEnemy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:960ce14c88a9249fa457064e6bc6f40ac3e20f5725b043f869bfa2e0677fff17 +size 26089 diff --git a/Content/Enemy/DA_Enemy.uasset b/Content/Enemy/DA_Enemy.uasset new file mode 100644 index 0000000..0f365a1 --- /dev/null +++ b/Content/Enemy/DA_Enemy.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c4f70bba8e950d78f22228e72b137fd5ddfacc9d41a61d2ec020989e0e50f73 +size 1751 diff --git a/Content/Gamemode/BP_DefaultGamemode.uasset b/Content/Gamemode/BP_DefaultGamemode.uasset index 2463e90..3b69536 100644 --- a/Content/Gamemode/BP_DefaultGamemode.uasset +++ b/Content/Gamemode/BP_DefaultGamemode.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8563c5c397f458b5cde8f1aebd6df3521c8428b35952b2bcc67ce568a8b5d4e7 -size 21547 +oid sha256:b7914a67317c8e03d9a2ba74fb2d1f640eb4ae9620e196003d4977e42eb7770b +size 21755 diff --git a/Source/vampires/EnemyCharacter.cpp b/Source/vampires/EnemyCharacter.cpp index 84b0902..eac145f 100644 --- a/Source/vampires/EnemyCharacter.cpp +++ b/Source/vampires/EnemyCharacter.cpp @@ -3,11 +3,15 @@ #include "EnemyCharacter.h" +#include "EnemyDataAsset.h" #include "EXPPickup.h" #include "HealthComponent.h" #include "ObjectPoolComponent.h" #include "ObjectPoolManager.h" +#include "PaperFlipbookComponent.h" +#include "VampireAIController.h" #include "VampireGameMode.h" +#include "Components/CapsuleComponent.h" #include "Kismet/GameplayStatics.h" AEnemyCharacter::AEnemyCharacter(const FObjectInitializer& ObjectInitializer) @@ -49,6 +53,49 @@ void AEnemyCharacter::OnDeath(FDamageInfo damageInfo) actorSpawnParameters); } +void AEnemyCharacter::LoadDataFromDataAsset_Implementation(UEnemyDataAsset* enemyDataAsset) +{ + if (enemyDataAsset != nullptr) + { + // TODO: Load more data + PaperFlipbookComponent->SetFlipbook(enemyDataAsset->PaperFlipbook); + + BehaviorTree = enemyDataAsset->BehaviorTree; + } +} + +void AEnemyCharacter::ResetData_Implementation() +{ + // TODO: Reset more data + PaperFlipbookComponent->SetFlipbook(nullptr); + + BehaviorTree = nullptr; +} + +float AEnemyCharacter::GetCapsuleRadius_Implementation() +{ + return GetCapsuleComponent() ? GetCapsuleComponent()->GetScaledCapsuleRadius() : -1.0f; +} + +void AEnemyCharacter::SpawnController_Implementation() +{ + if (!Controller) + { + SpawnDefaultController(); + } + + if (BehaviorTree != nullptr) + { + AVampireAIController* controller = Cast(Controller); + controller->RunBehaviorTree(BehaviorTree); + } +} + +UHealthComponent* AEnemyCharacter::GetEnemyHealthComponent_Implementation() +{ + return GetHealthComponent(); +} + void AEnemyCharacter::ResetHealth() { GetHealthComponent()->ResetHealth(); diff --git a/Source/vampires/EnemyCharacter.h b/Source/vampires/EnemyCharacter.h index c01c0ef..06a3f56 100644 --- a/Source/vampires/EnemyCharacter.h +++ b/Source/vampires/EnemyCharacter.h @@ -3,8 +3,8 @@ #pragma once #include "CoreMinimal.h" -#include "HealthComponent.h" #include "VampireCharacter.h" +#include "Interfaces/Enemyable.h" #include "EnemyCharacter.generated.h" class UObjectPoolComponent; @@ -14,7 +14,7 @@ class AEXPPickup; * */ UCLASS() -class VAMPIRES_API AEnemyCharacter : public AVampireCharacter +class VAMPIRES_API AEnemyCharacter : public AVampireCharacter, public IEnemyable { GENERATED_BODY() @@ -44,6 +44,21 @@ public: UFUNCTION() virtual void OnDeath(FDamageInfo damageInfo); + + UFUNCTION() + virtual void LoadDataFromDataAsset_Implementation(UEnemyDataAsset* enemyDataAsset) override; + + UFUNCTION() + virtual void ResetData_Implementation() override; + + UFUNCTION() + virtual float GetCapsuleRadius_Implementation() override; + + UFUNCTION() + virtual void SpawnController_Implementation() override; + + UFUNCTION() + virtual UHealthComponent* GetEnemyHealthComponent_Implementation() override; private: UFUNCTION() diff --git a/Source/vampires/EnemyDataAsset.cpp b/Source/vampires/EnemyDataAsset.cpp new file mode 100644 index 0000000..c3f81b1 --- /dev/null +++ b/Source/vampires/EnemyDataAsset.cpp @@ -0,0 +1,4 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "EnemyDataAsset.h" diff --git a/Source/vampires/EnemyDataAsset.h b/Source/vampires/EnemyDataAsset.h new file mode 100644 index 0000000..fe1246a --- /dev/null +++ b/Source/vampires/EnemyDataAsset.h @@ -0,0 +1,26 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "EnemyDataAsset.generated.h" + +class UPaperFlipbook; +class UBehaviorTree; + +/** + * + */ +UCLASS() +class VAMPIRES_API UEnemyDataAsset : public UDataAsset +{ + GENERATED_BODY() + +public: + UPROPERTY(BlueprintReadWrite, EditAnywhere) + UPaperFlipbook* PaperFlipbook; + + UPROPERTY(EditDefaultsOnly, Meta = (AllowPrivateAccess = "true")) + UBehaviorTree* BehaviorTree = nullptr; +}; diff --git a/Source/vampires/Interfaces/Enemyable.cpp b/Source/vampires/Interfaces/Enemyable.cpp new file mode 100644 index 0000000..cf99eb0 --- /dev/null +++ b/Source/vampires/Interfaces/Enemyable.cpp @@ -0,0 +1,7 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "Enemyable.h" + + +// Add default functionality here for any IEnemyable functions that are not pure virtual. diff --git a/Source/vampires/Interfaces/Enemyable.h b/Source/vampires/Interfaces/Enemyable.h new file mode 100644 index 0000000..ea53c1e --- /dev/null +++ b/Source/vampires/Interfaces/Enemyable.h @@ -0,0 +1,42 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "Enemyable.generated.h" + +class UHealthComponent; +class UEnemyDataAsset; + +// This class does not need to be modified. +UINTERFACE() +class UEnemyable : public UInterface +{ + GENERATED_BODY() +}; + +/** + * + */ +class VAMPIRES_API IEnemyable +{ + GENERATED_BODY() + + // Add interface functions to this class. This is the class that will be inherited to implement this interface. +public: + UFUNCTION(BlueprintNativeEvent) + void LoadDataFromDataAsset(UEnemyDataAsset* projectileDataAsset); + + UFUNCTION(BlueprintNativeEvent) + void ResetData(); + + UFUNCTION(BlueprintNativeEvent) + float GetCapsuleRadius(); + + UFUNCTION(BlueprintNativeEvent) + void SpawnController(); + + UFUNCTION(BlueprintNativeEvent) + UHealthComponent* GetEnemyHealthComponent(); +}; diff --git a/Source/vampires/Projectile.cpp b/Source/vampires/Projectile.cpp index 28a3fe8..3bc63d6 100644 --- a/Source/vampires/Projectile.cpp +++ b/Source/vampires/Projectile.cpp @@ -4,6 +4,7 @@ #include "Projectile.h" #include "EnemyCharacter.h" +#include "HealthComponent.h" #include "ObjectPoolManager.h" #include "ProjectileDataAsset.h" #include "Components/SphereComponent.h" diff --git a/Source/vampires/VampireGameMode.cpp b/Source/vampires/VampireGameMode.cpp index 9d27a86..c74b26c 100644 --- a/Source/vampires/VampireGameMode.cpp +++ b/Source/vampires/VampireGameMode.cpp @@ -78,24 +78,26 @@ void AVampireGameMode::SpawnEnemy() FActorSpawnParameters SpawnParameters; SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; - if (AActor* object = GetEnemyObjectPoolManager_Implementation()->GetObject()) + if (AActor* enemy = GetEnemyObjectPoolManager_Implementation()->GetObject()) { - AEnemyCharacter* Actor = Cast(object); - Actor->SetActorTransform(Transform); - float CapsuleRadius = Actor->GetCapsuleComponent()->GetScaledCapsuleRadius(); - FVector Direction = SpawnLocation - PlayerCharacter->GetActorLocation(); - Direction.Normalize(); - Direction *= CapsuleRadius; - Actor->SetActorLocation(SpawnLocation + Direction); - - if (!Actor->Controller) + if (UKismetSystemLibrary::DoesImplementInterface(enemy, UEnemyable::StaticClass()) && EnemyDataAssets.Num() > 0) { - Actor->SpawnDefaultController(); - } + IEnemyable::Execute_LoadDataFromDataAsset(enemy, EnemyDataAssets[FMath::RandRange(0, EnemyDataAssets.Num() - 1)]); + + enemy->SetActorTransform(Transform); + float CapsuleRadius = IEnemyable::Execute_GetCapsuleRadius(enemy); + FVector Direction = SpawnLocation - PlayerCharacter->GetActorLocation(); + Direction.Normalize(); + Direction *= CapsuleRadius; + enemy->SetActorLocation(SpawnLocation + Direction); - if (!Actor->GetHealthComponent()->OnDeath.IsAlreadyBound(this, &AVampireGameMode::HandleOnEnemyDeath)) - { - Actor->GetHealthComponent()->OnDeath.AddDynamic(this, &AVampireGameMode::HandleOnEnemyDeath); + IEnemyable::Execute_SpawnController(enemy); + + UHealthComponent* healthComponent = IEnemyable::Execute_GetEnemyHealthComponent(enemy); + if (!healthComponent->OnDeath.IsAlreadyBound(this, &AVampireGameMode::HandleOnEnemyDeath)) + { + healthComponent->OnDeath.AddDynamic(this, &AVampireGameMode::HandleOnEnemyDeath); + } } } } diff --git a/Source/vampires/VampireGameMode.h b/Source/vampires/VampireGameMode.h index b43e80b..707afc4 100644 --- a/Source/vampires/VampireGameMode.h +++ b/Source/vampires/VampireGameMode.h @@ -8,6 +8,7 @@ #include "Interfaces/Pools.h" #include "VampireGameMode.generated.h" +class UEnemyDataAsset; class AProjectile; class AObjectPoolManager; class AVampirePlayerController; @@ -30,6 +31,9 @@ public: FOnEnemyDeathCountIncrementDelegate OnEnemyDeathCountIncrementDelegate; + UPROPERTY(EditDefaultsOnly) + TArray> EnemyDataAssets; + private: TObjectPtr PlayerCharacter; diff --git a/Source/vampires/Weapons/GarlicWeapon.cpp b/Source/vampires/Weapons/GarlicWeapon.cpp index 717275e..3056697 100644 --- a/Source/vampires/Weapons/GarlicWeapon.cpp +++ b/Source/vampires/Weapons/GarlicWeapon.cpp @@ -4,6 +4,7 @@ #include "GarlicWeapon.h" #include "Components/SphereComponent.h" #include "vampires/EnemyCharacter.h" +#include "vampires/HealthComponent.h" AGarlicWeapon::AGarlicWeapon() { diff --git a/Source/vampires/Weapons/LightningRingWeapon.cpp b/Source/vampires/Weapons/LightningRingWeapon.cpp index ec83d9e..b2c8a42 100644 --- a/Source/vampires/Weapons/LightningRingWeapon.cpp +++ b/Source/vampires/Weapons/LightningRingWeapon.cpp @@ -4,6 +4,7 @@ #include "LightningRingWeapon.h" #include "Components/SphereComponent.h" #include "vampires/EnemyCharacter.h" +#include "vampires/HealthComponent.h" ALightningRingWeapon::ALightningRingWeapon() { diff --git a/vampires.sln.DotSettings.user b/vampires.sln.DotSettings.user new file mode 100644 index 0000000..cde42e4 --- /dev/null +++ b/vampires.sln.DotSettings.user @@ -0,0 +1,2 @@ + + ForceIncluded \ No newline at end of file