24 Commits

Author SHA1 Message Date
ed5b49ebae Merge branch 'develop' 2023-10-22 00:46:21 +09:00
c3e1bb932d 머지 및 버그픽스 대충 완료 2023-10-22 00:43:43 +09:00
ef12cf0dbd Merge branch 'SJW1024' into develop
# Conflicts:
#	Content/Maps/DevMap.umap
2023-10-21 23:14:00 +09:00
ssasin3801
7340756d96 맵 기본 틀 잡기
# Conflicts:
#	Content/Maps/DevMap.umap
2023-10-21 23:11:42 +09:00
SJW1024
5ad7df473b 버프 시스템 샘플 -완- 2023-10-16 02:51:26 +09:00
SJW1024
0fc3bf0ec9 평타 알고리즘 최종(duration 초기화/적 캐릭터만 지정 기능 추가 필요)
캐릭터 체력바 UI 추가(실시간 업데이트 구현 실패)
MaxStats Enum 추가, stats에 경험치 관련 스탯 추가
2023-10-15 23:11:06 +09:00
SJW1024
1e14efdea4 평타 알고리즘 최종(duration 초기화/적 캐릭터만 지정 기능 추가 필요) 2023-10-15 23:06:32 +09:00
SJW1024
f9d36a2824 평타알고리즘 최종(반복 사이클만 설정하면 끝) 2023-10-15 19:25:18 +09:00
SJW1024
a201059fbb 평타 알고리즘 22 2023-10-15 01:23:33 +09:00
SJW1024
d3025bfbfa 기본 공격 알고리즘 설계중 2023-10-15 00:35:56 +09:00
fe6d559697 코스트 체크 완성 2023-10-10 23:59:57 +09:00
2a22ff140f 0뎀은 데미지가 아니에요!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2023-10-10 23:38:27 +09:00
3615e7be0a 머지 완료, 데미지 관련 간단 구현 2023-10-10 23:35:41 +09:00
39e95c5cf8 Merge branch 'HappyTanuki' into SJW1024
# Conflicts:
#	Content/Character/BP_Folder/DefaultClass.uasset
#	Content/Character/Lb/Animation/ABP_Lb.uasset
#	Content/Character/Lb/Animation/R2_Anim.uasset
#	Content/Maps/DevMap.umap
#	Source/Promether/PlayerGeneric/DefaultPlayerController.cpp
#	Source/Promether/PlayerGeneric/DefaultPlayerController.h
2023-10-10 20:53:38 +09:00
ae124e49f0 타이먼 기반 땜빵 코딩 2023-10-08 18:59:33 +09:00
69852b9541 스탯이 이제 stats와 동기화됩니다. 2023-10-08 05:12:55 +09:00
52e4c37ee5 코드 정리 + stats FName구현체 2023-10-08 04:45:12 +09:00
SJW1024
64d92be895 리아나 전체 모션 및 파운드 궁극기 모션 삽입 2023-10-07 22:26:53 +09:00
deef14d8b5 이상한 맵 삭제 및 abp 구조 수정 2023-10-07 20:45:53 +09:00
326ae353d3 회전방향 동기화 2023-10-07 20:13:01 +09:00
359231da00 Merge branch 'develop' 2023-10-03 22:26:46 +09:00
58785ac8a3 Merge branch 'develop' 2023-10-03 22:24:21 +09:00
5cd15e1bde Merge branch 'develop' 2023-10-03 21:43:38 +09:00
0a7e29868d Merge branch 'develop' 2023-09-26 01:55:27 +09:00
67 changed files with 479 additions and 604 deletions

BIN
Content/Blueprints/BP_DefaultPlayerCharacter.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/DefaultClass.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/ContinueActing.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/ContinueAttack.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/ContinueMoving.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/ContinueSkilluse.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/Rotating.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/StopActing.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/StopAttack.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/StopMoving.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/StopSkilluse.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Notify/WallEnd.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/UI/NameBar_UI/Hp_UI.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/UI/NameBar_UI/NameBar_UI.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Character/Allium/BP_Allium.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/Character/Lb/BP_Lb.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Character/Lb/EskillBuff.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Character/Lb/LB_Bolla_Throw.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/Character/Notify/Rotating.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Character/Notify/StopActing.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Character/Notify/StopAttack.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Character/Notify/StopMoving.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
Content/Character/Notify/WallEnd.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Character/Riana/Animation/ABP_Riana.uasset (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Content/Character/Riana/BP_Riana.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Effect/ETC/Burning.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Effect/LB/Arrow/Arrow_Flash.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/Effect/LB/LB_Sprint.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

BIN
Content/InputActions/ObjectSelect.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/InputActions/Skill4.uasset (Stored with Git LFS)

Binary file not shown.

BIN
Content/InputActions/Skill4_End.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Maps/DevMap.umap (Stored with Git LFS)

Binary file not shown.

BIN
Content/Maps/Untitled.umap (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,14 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AN_Skill4_End.h"
#include "../PlayerGeneric/DefaultPlayerCharacter.h"
void UAN_Skill4_End::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
{
ADefaultPlayerCharacter* MyCharacter = MeshComp->GetOwner<ADefaultPlayerCharacter>();
if (!MyCharacter) return;
MyCharacter->Skill4_End();
}

View File

@@ -0,0 +1,19 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimNotifies/AnimNotify.h"
#include "AN_Skill4_End.generated.h"
/**
*
*/
UCLASS()
class PROMETHER_API UAN_Skill4_End : public UAnimNotify
{
GENERATED_BODY()
public:
virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
};

View File

@@ -1,79 +0,0 @@
#pragma once
#include "CoreMinimal.h"
#include "DefaultStats.generated.h"
USTRUCT(Atomic, BlueprintType)
struct FDefaultStats
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 XP;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float HPRegeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float HealAndShieldpower;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Armor;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float MagicResistance;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Tenacity;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float SlowRisist;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AttackSpeed;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AttackDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AbilityPower;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float CriticalStrikeChance;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float CriticalStrikeDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ArmorPenetration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float MagicPenetration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float LifeSteal;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float PhysicalVamp;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Omnivamp;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AbilityHaste;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Mana;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ManaRegeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Energy;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float EnergyRegeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AttackRange;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float MovementSpeed;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float GoldGeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AttackDamageGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float AttackSpeedGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ArmorGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float MagicResistanceGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float HealthGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float HealthRegenerationGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ManaGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float ManaRegenerationGrowth;
};

View File

@@ -133,7 +133,7 @@ FString ADeathmatch::InitNewPlayer(APlayerController* NewPlayerController, const
//DebugPerpose
if (Type == CharacterType::Lukriel)
{
Type = CharacterType::Allium;
Type = CharacterType::Lb;
}
if (Team == TeamType::Null)
{

View File

@@ -1,34 +0,0 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
#include "Net/UnrealNetwork.h"
// Sets default values
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AMyActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyActor, example);
}

View File

@@ -1,30 +0,0 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "PrometherEnum.h"
#include "MyActor.generated.h"
UCLASS()
class PROMETHER_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
void GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const override;
UPROPERTY(Replicated, EditAnywhere, BlueprintReadWrite)
FDefaultStats example;
};

View File

@@ -25,39 +25,11 @@ ADefaultPlayerCharacter::ADefaultPlayerCharacter()
Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
Camera->SetupAttachment(CameraSpringArm, USpringArmComponent::SocketName);
Health = 0.0f;
HPRegeneration = 0.0f;
HealAndShieldpower = 0.0f;
Armor = 0.0f;
MagicResistance = 0.0f;
Tenacity = 0.0f;
SlowRisist = 0.0f;
AttackSpeed = 0.0f;
AttackDamage = 0.0f;
AbilityPower = 0.0f;
CriticalStrikeChance = 0.0f;
CriticalStrikeDamage = 0.0f;
ArmorPenetration = 0.0f;
MagicPenetration = 0.0f;
LifeSteal = 0.0f;
PhysicalVamp = 0.0f;
Omnivamp = 0.0f;
AbilityHaste = 0.0f;
Mana = 0.0f;
ManaRegeneration = 0.0f;
Energy = 0.0f;
EnergyRegeneration = 0.0f;
AttackRange = 0.0f;
MovementSpeed = 0.0f;
GoldGeneration = 0.0f;
AttackDamageGrowth = 0.0f;
AttackSpeedGrowth = 0.0f;
ArmorGrowth = 0.0f;
MagicResistanceGrowth = 0.0f;
HealthGrowth = 0.0f;
HealthRegenerationGrowth = 0.0f;
ManaGrowth = 0.0f;
ManaRegenerationGrowth = 0.0f;
for (uint8 i = 0; i < (uint8)EStats::SIZE; i++)
DefaultStats.Add((EStats)i, 0.0f);
for (uint8 i = 0; i < (uint8)CooldownType::SIZE; i++)
CooldownDuration.Add((CooldownType)i, 0.0f);
}
void ADefaultPlayerCharacter::Tick(float DeltaTime)
@@ -104,15 +76,15 @@ float ADefaultPlayerCharacter::TakeDamage_Implementation(float DamageAmount, str
float ADDamageMultiplier = 0;
float APDamageMultiplier = 0;
if (MyState->Stats.Armor >= 0)
ADDamageMultiplier = 100 / (100 + MyState->Stats.Armor);
if (MyState->Stats[(uint8)EStats::Armor] >= 0)
ADDamageMultiplier = 100 / (100 + MyState->Stats[(uint8)EStats::Armor]);
else
ADDamageMultiplier = 2 - 100 / (100 - MyState->Stats.Armor);
ADDamageMultiplier = 2 - 100 / (100 - MyState->Stats[(uint8)EStats::Armor]);
if (MyState->Stats.MagicResistance >= 0)
APDamageMultiplier = 100 / (100 + MyState->Stats.MagicResistance);
if (MyState->Stats[(uint8)EStats::MagicResistance] >= 0)
APDamageMultiplier = 100 / (100 + MyState->Stats[(uint8)EStats::MagicResistance]);
else
APDamageMultiplier = 2 - 100 / (100 - MyState->Stats.MagicResistance);
APDamageMultiplier = 2 - 100 / (100 - MyState->Stats[(uint8)EStats::MagicResistance]);
UE_LOG(LogTemp, Warning, TEXT("%s : ADDamageMultiplier : %f CalculatedDamage : %f"), *DamageCauser->GetName(), ADDamageMultiplier, DamageAmount * ADDamageMultiplier);
@@ -122,17 +94,17 @@ float ADefaultPlayerCharacter::TakeDamage_Implementation(float DamageAmount, str
{
UE_LOG(LogTemp, Warning, TEXT("DamageType : BaseAttack"));
float UpdatedHealth = MyState->Stats.Health - EventInstigatorState->Stats.AttackDamage * ADDamageMultiplier;
float UpdatedHealth = MyState->Stats[(uint8)EStats::Health] - EventInstigatorState->Stats[(uint8)EStats::AttackDamage] * ADDamageMultiplier;
if (UpdatedHealth < 0)
{
MyState->Stats.Health = 0;
MyState->Stats[(uint8)EStats::Health] = 0;
}
else
{
MyState->Stats.Health = UpdatedHealth;
MyState->Stats[(uint8)EStats::Health] = UpdatedHealth;
}
UE_LOG(LogTemp, Warning, TEXT("Current Health : %f"), MyState->Stats.Health);
UE_LOG(LogTemp, Warning, TEXT("Current Health : %f"), MyState->Stats[(uint8)EStats::Health]);
}
}
@@ -186,6 +158,16 @@ void ADefaultPlayerCharacter::NetMulticast_Skill4_Implementation()
BP_Skill4();
}
void ADefaultPlayerCharacter::Skill4_End_Implementation()
{
NetMulticast_Skill4_End();
}
void ADefaultPlayerCharacter::NetMulticast_Skill4_End_Implementation()
{
BP_Skill4_End();
}
void ADefaultPlayerCharacter::Skill5_Implementation()
{
NetMulticast_Skill5();

View File

@@ -65,6 +65,14 @@ public:
UFUNCTION(NetMulticast, Reliable)
void NetMulticast_Skill4();
UFUNCTION(BlueprintCallable, Server, Reliable)
void Skill4_End();
//Override me
UFUNCTION(BlueprintImplementableEvent)
void BP_Skill4_End();
UFUNCTION(NetMulticast, Reliable)
void NetMulticast_Skill4_End();
UFUNCTION(BlueprintCallable, Server, Reliable)
void Skill5();
//Override me
@@ -89,121 +97,14 @@ public:
UFUNCTION(NetMulticast, Reliable)
void NetMulticast_Skill7();
float GetHealth() const { return Health; }
float GetHPRegeneration() const { return HPRegeneration; }
float GetHealAndShieldpower() const { return HealAndShieldpower; }
float GetArmor() const { return Armor; }
float GetMagicResistance() const { return MagicResistance; }
float GetTenacity() const { return Tenacity; }
float GetSlowRisist() const { return SlowRisist; }
float GetAttackSpeed() const { return AttackSpeed; }
float GetAttackDamage() const { return AttackDamage; }
float GetAbilityPower() const { return AbilityPower; }
float GetCriticalStrikeChance() const { return CriticalStrikeChance; }
float GetCriticalStrikeDamage() const { return CriticalStrikeDamage; }
float GetArmorPenetration() const { return ArmorPenetration; }
float GetMagicPenetration() const { return MagicPenetration; }
float GetLifeSteal() const { return LifeSteal; }
float GetPhysicalVamp() const { return PhysicalVamp; }
float GetOmnivamp() const { return Omnivamp; }
float GetAbilityHaste() const { return AbilityHaste; }
const float* GetCooldownDuration() const { return CooldownDuration; }
float GetMana() const { return Mana; }
float GetManaRegeneration() const { return ManaRegeneration; }
float GetEnergy() const { return Energy; }
float GetEnergyRegeneration() const { return EnergyRegeneration; }
float GetAttackRange() const { return AttackRange; }
float GetMovementSpeed() const { return MovementSpeed; }
float GetGoldGeneration() const { return GoldGeneration; }
float GetAttackDamageGrowth() const { return AttackDamageGrowth; }
float GetAttackSpeedGrowth() const { return AttackSpeedGrowth; }
float GetArmorGrowth() const { return ArmorGrowth; }
float GetMagicResistanceGrowth() const { return MagicResistanceGrowth; }
float GetHealthGrowth() const { return HealthGrowth; }
float GetHealthRegenerationGrowth() const { return HealthRegenerationGrowth; }
float GetManaGrowth() const { return ManaGrowth; }
float GetManaRegenerationGrowth() const { return ManaRegenerationGrowth; }
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats")
TMap<EStats, float> DefaultStats;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats")
TMap<CooldownType, float> CooldownDuration;
protected:
UPROPERTY(EditAnywhere)
USpringArmComponent* CameraSpringArm;
UPROPERTY(EditAnywhere)
UCameraComponent* Camera;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float HPRegeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float HealAndShieldpower;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float Armor;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float MagicResistance;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float Tenacity;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Defensive")
float SlowRisist;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float AttackSpeed;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float AttackDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float AbilityPower;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float CriticalStrikeChance;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float CriticalStrikeDamage;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float ArmorPenetration;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float MagicPenetration;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float LifeSteal;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float PhysicalVamp;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Offensive")
float Omnivamp;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility|Haste")
float AbilityHaste;
UPROPERTY(EditAnywhere, Category = "Stats|Utility|Haste")
float CooldownDuration[(uint8)CooldownType::SIZE] = { 0.0f, };
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility|Resource")
float Mana;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility|Resource")
float ManaRegeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility|Resource")
float Energy;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility|Resource")
float EnergyRegeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility")
float AttackRange;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility")
float MovementSpeed;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Utility|Non-Combat")
float GoldGeneration;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float AttackDamageGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float AttackSpeedGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float ArmorGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float MagicResistanceGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float HealthGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float HealthRegenerationGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float ManaGrowth;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Stats|Increasing Statistics")
float ManaRegenerationGrowth;
};

View File

@@ -18,17 +18,19 @@ void ADefaultPlayerController::BeginPlay()
{
Super::BeginPlay();
if (ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player)) {
if (UEnhancedInputLocalPlayerSubsystem* InputSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>()) {
if (!PlayerInputMapping.IsNull()) {
InputSystem->AddMappingContext(PlayerInputMapping.LoadSynchronous(), 0);
}
else {
UE_LOG(LogTemp, Error, TEXT("AddMappingContext Failed"));
}
}
ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(Player);
if (!LocalPlayer) return;
UEnhancedInputLocalPlayerSubsystem* InputSystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>();
if (!InputSystem) return;
if (PlayerInputMapping.IsNull())
{
UE_LOG(LogTemp, Error, TEXT("AddMappingContext Failed"));
return;
}
InputSystem->AddMappingContext(PlayerInputMapping.LoadSynchronous(), 0);
this->bShowMouseCursor = true;
}
@@ -39,16 +41,29 @@ void ADefaultPlayerController::OnPossess(APawn* aPawn)
Server_SpawnPlayerCamera();
AActor *PlayerCamera = GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera();
if (PlayerCamera)
{
SetViewTarget(PlayerCamera);
UE_LOG(LogTemp, Warning, TEXT("SetViewTarget Success : %s"), *GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera()->GetName());
}
else
if (!PlayerCamera)
{
UE_LOG(LogTemp, Error, TEXT("GetPlayerCamera Failed."));
return;
}
SetViewTarget(PlayerCamera);
UE_LOG(LogTemp, Warning, TEXT("SetViewTarget Success : %s"), *GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera()->GetName());
ADefaultPlayerCharacter* ControlledPawn = GetPawn<ADefaultPlayerCharacter>();
if (!ControlledPawn) return;
ADefaultPlayerState* MyPlayerState = GetPlayerState<ADefaultPlayerState>();
if (!MyPlayerState) return;
TArray<float> DefaultStatsValue;
TArray<float> CooldownDurationValue;
ControlledPawn->DefaultStats.GenerateValueArray(DefaultStatsValue);
ControlledPawn->CooldownDuration.GenerateValueArray(CooldownDurationValue);
MyPlayerState->InitPlayerStats(DefaultStatsValue, CooldownDurationValue);
}
void ADefaultPlayerController::OnUnPossess()
@@ -66,48 +81,46 @@ void ADefaultPlayerController::Server_SpawnPlayerCamera_Implementation()
UE_LOG(LogTemp, Warning, TEXT("SpawnPlayerCamera"));
if (APawn* MyPawn = GetPawn())
APawn* MyPawn = GetPawn();
if (!MyPawn) return;
FTransform SpawnTransform = FTransform();
SpawnTransform.SetLocation(MyPawn->GetActorLocation());
OutContextPlayerCamera = GetWorld()->SpawnActor<AActor>(ADefaultPlayerCamera::StaticClass(), SpawnTransform, SpawnInfo);
if (!OutContextPlayerCamera)
{
FTransform SpawnTransform = FTransform();
SpawnTransform.SetLocation(MyPawn->GetActorLocation());
OutContextPlayerCamera = GetWorld()->SpawnActor<AActor>(ADefaultPlayerCamera::StaticClass(), SpawnTransform, SpawnInfo);
if (OutContextPlayerCamera)
{
GetPlayerState<ADefaultPlayerState>()->SetPlayerCamera(OutContextPlayerCamera);
OutContextPlayerCamera->AttachToActor(GetPawn(), FAttachmentTransformRules(EAttachmentRule::SnapToTarget, EAttachmentRule::KeepWorld, EAttachmentRule::KeepWorld, false));
UE_LOG(LogTemp, Warning, TEXT("SetPlayerCamera Success : %s, %d"), *GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera()->GetName(), GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera());
}
else
{
UE_LOG(LogTemp, Error, TEXT("Camera Spawn Failed."));
}
UE_LOG(LogTemp, Error, TEXT("Camera Spawn Failed."));
return;
}
GetPlayerState<ADefaultPlayerState>()->SetPlayerCamera(OutContextPlayerCamera);
OutContextPlayerCamera->AttachToActor(GetPawn(), FAttachmentTransformRules(EAttachmentRule::SnapToTarget, EAttachmentRule::KeepWorld, EAttachmentRule::KeepWorld, false));
UE_LOG(LogTemp, Warning, TEXT("SetPlayerCamera Success : %s, %d"), *GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera()->GetName(), GetPlayerState<ADefaultPlayerState>()->GetPlayerCamera());
}
void ADefaultPlayerController::SetACharacterOutlineColor(ACharacter* Target, bool Visible)
{
if (!HasAuthority())
if (HasAuthority()) return;
ADefaultPlayerState* State = Target->GetPlayerState<ADefaultPlayerState>();
if (!State)
{
if (ADefaultPlayerState* State = Target->GetPlayerState<ADefaultPlayerState>())
{
if (State->GetTeam() == GetPlayerState<ADefaultPlayerState>()->GetTeam())
{
Target->GetMesh()->SetRenderCustomDepth(Visible);
Target->GetMesh()->CustomDepthStencilValue = 1;
}
else
{
Target->GetMesh()->SetRenderCustomDepth(Visible);
Target->GetMesh()->CustomDepthStencilValue = 2;
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("GetPlayerState<ADefaultPlayerState> Failed"));
}
UE_LOG(LogTemp, Error, TEXT("GetPlayerState<ADefaultPlayerState> Failed"));
return;
}
if (State->GetTeam() == GetPlayerState<ADefaultPlayerState>()->GetTeam())
{
Target->GetMesh()->SetRenderCustomDepth(Visible);
Target->GetMesh()->CustomDepthStencilValue = 1;
}
else
{
Target->GetMesh()->SetRenderCustomDepth(Visible);
Target->GetMesh()->CustomDepthStencilValue = 2;
}
}
@@ -215,34 +228,36 @@ void ADefaultPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent))
{
EnhancedInputComponent->BindAction(Skill1Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill1);
EnhancedInputComponent->BindAction(Skill2Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill2);
EnhancedInputComponent->BindAction(Skill3Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill3);
EnhancedInputComponent->BindAction(Skill4Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill4);
EnhancedInputComponent->BindAction(RuneSpell1Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::RuneSpell1);
EnhancedInputComponent->BindAction(RuneSpell2Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::RuneSpell2);
EnhancedInputComponent->BindAction(WardAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Ward);
EnhancedInputComponent->BindAction(BombAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Bomb);
EnhancedInputComponent->BindAction(ObjectSelectAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::ObjectSelect);
EnhancedInputComponent->BindAction(MoveAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::MoveTriggered);
EnhancedInputComponent->BindAction(MoveAction.Get(), ETriggerEvent::Started, this, &ADefaultPlayerController::MoveStarted);
}
UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent);
if (!EnhancedInputComponent) return;
EnhancedInputComponent->BindAction(Skill1Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill1);
EnhancedInputComponent->BindAction(Skill2Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill2);
EnhancedInputComponent->BindAction(Skill3Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill3);
EnhancedInputComponent->BindAction(Skill4Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Skill4Triggered);
EnhancedInputComponent->BindAction(Skill4Action.Get(), ETriggerEvent::Completed, this, &ADefaultPlayerController::Skill4Completed);
EnhancedInputComponent->BindAction(RuneSpell1Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::RuneSpell1);
EnhancedInputComponent->BindAction(RuneSpell2Action.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::RuneSpell2);
EnhancedInputComponent->BindAction(WardAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Ward);
EnhancedInputComponent->BindAction(BombAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Bomb);
EnhancedInputComponent->BindAction(ObjectSelectAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::ObjectSelect);
EnhancedInputComponent->BindAction(MoveAction.Get(), ETriggerEvent::Triggered, this, &ADefaultPlayerController::Move);
}
void ADefaultPlayerController::Skill1()
{
//if (!(GetPlayerState<ADefaultPlayerState>()->Stats.Mana >= 100))
// return;
if (!(GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Mana] >= GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Skill1Cost]))
return;
ACharacter* HitObject = nullptr;
FVector Location = GetPawn()->GetActorLocation();
Location.Z = 0;
SimpleMoveToLocation(this, Location);
this->MoveToLocation(Location);
Server_StopMove();
Multicast_StopMove();
GetPawn()->SetActorRotation((GetMouseHitLocation() - Location).Rotation());
Multicast_SetRotation(GetMouseHitLocation());
Server_SetRotation(GetMouseHitLocation());
UE_LOG(LogTemp, Warning, TEXT("Skill1"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
@@ -251,13 +266,18 @@ void ADefaultPlayerController::Skill1()
void ADefaultPlayerController::Skill2()
{
if (!(GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Mana] >= GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Skill2Cost]))
return;
ACharacter* HitObject = nullptr;
FVector Location = GetPawn()->GetActorLocation();
Location.Z = 0;
SimpleMoveToLocation(this, Location);
this->MoveToLocation(Location);
Server_StopMove();
Multicast_StopMove();
GetPawn()->SetActorRotation((GetMouseHitLocation() - Location).Rotation());
Multicast_SetRotation(GetMouseHitLocation());
Server_SetRotation(GetMouseHitLocation());
UE_LOG(LogTemp, Warning, TEXT("Skill2"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
@@ -266,32 +286,49 @@ void ADefaultPlayerController::Skill2()
void ADefaultPlayerController::Skill3()
{
if (!(GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Mana] >= GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Skill3Cost]))
return;
ACharacter* HitObject = nullptr;
FVector Location = GetPawn()->GetActorLocation();
Location.Z = 0;
SimpleMoveToLocation(this, Location);
this->MoveToLocation(Location);
Server_StopMove();
Multicast_StopMove();
GetPawn()->SetActorRotation((GetMouseHitLocation() - Location).Rotation());
Multicast_SetRotation(GetMouseHitLocation());
Server_SetRotation(GetMouseHitLocation());
UE_LOG(LogTemp, Warning, TEXT("Skill3"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Skill3);
}
void ADefaultPlayerController::Skill4()
void ADefaultPlayerController::Skill4Triggered()
{
if (!(GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Mana] >= GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Skill4Cost]))
return;
ACharacter* HitObject = nullptr;
FVector Location = GetPawn()->GetActorLocation();
Location.Z = 0;
SimpleMoveToLocation(this, Location);
this->MoveToLocation(Location);
Server_StopMove();
Multicast_StopMove();
GetPawn()->SetActorRotation((GetMouseHitLocation() - Location).Rotation());
Multicast_SetRotation(GetMouseHitLocation());
Server_SetRotation(GetMouseHitLocation());
UE_LOG(LogTemp, Warning, TEXT("Skill4"));
UE_LOG(LogTemp, Warning, TEXT("Skill4 Triggered"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Skill4Started);
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Skill4Triggered);
}
void ADefaultPlayerController::Skill4Completed()
{
UE_LOG(LogTemp, Warning, TEXT("Skill4 Completed"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Skill4Comlpleted);
}
void ADefaultPlayerController::RuneSpell1()
@@ -331,30 +368,66 @@ void ADefaultPlayerController::ObjectSelect()
GetHitResultUnderCursorForObjects(ObjectTypes, true, HitResult);
if (ACharacter* HitObject = Cast<ACharacter>(HitResult.GetActor()))
{
UE_LOG(LogTemp, Warning, TEXT("%s"), *HitObject->GetName());
SetACharacterOutlineColor(HitObject, true);
}
ACharacter* HitObject = Cast<ACharacter>(HitResult.GetActor());
if (!HitObject) return;
UE_LOG(LogTemp, Warning, TEXT("%s"), *HitObject->GetName());
SetACharacterOutlineColor(HitObject, true);
}
void ADefaultPlayerController::MoveTriggered()
{
Move();
}
void ADefaultPlayerController::MoveStarted()
{
Move();
}
void ADefaultPlayerController::Move()
{
FVector Destination = GetMouseHitLocation();
FHitResult HitResult;
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Moving);
SimpleMoveToLocation(this, Destination);
this->MoveToLocation(Destination);
GetHitResultUnderCursorForObjects(ObjectTypes, true, HitResult);
ACharacter* HitCharacter = Cast<ACharacter>(HitResult.GetActor()); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HitCharactor<6F><72> <20><><EFBFBD><EFBFBD><<<3C><><EFBFBD><EFBFBD> <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
if (HitCharacter != nullptr) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HitObject<63><74> null<6C><6C> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD> Attack()<29><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>, HitObject<63><74> <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
{
Attack(HitCharacter); //HitObject<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Attack <20><><EFBFBD><EFBFBD>
}
else
{
FVector Destination = GetMouseHitLocation();
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Moving);
SimpleMoveToLocation(this, Destination);
this->MoveToLocation(Destination);
}
}
void ADefaultPlayerController::Multicast_SetRotation_Implementation(FVector MouseHitLocation)
{
FVector Location = GetPawn()->GetActorLocation();
Location.Z = 0;
GetPawn()->SetActorRotation((MouseHitLocation - Location).Rotation());
}
void ADefaultPlayerController::Server_SetRotation_Implementation(FVector MouseHitLocation)
{
Multicast_SetRotation(MouseHitLocation);
}
void ADefaultPlayerController::Server_StopMove_Implementation()
{
Multicast_StopMove();
}
void ADefaultPlayerController::Multicast_StopMove_Implementation()
{
UPathFollowingComponent* PFollowComp = this->FindComponentByClass<UPathFollowingComponent>();
if (!PFollowComp) return;
PFollowComp->OnRequestFinished.Clear();
PFollowComp->RequestMoveWithImmediateFinish(EPathFollowingResult::Success);
PFollowComp->OnRequestFinished.AddUObject(this, &ADefaultPlayerController::OnMoveCompleted);
}
FVector ADefaultPlayerController::GetMouseHitLocation()
@@ -363,7 +436,7 @@ FVector ADefaultPlayerController::GetMouseHitLocation()
GetHitResultUnderCursor(ECollisionChannel::ECC_Visibility, true, HitResult);
HitResult.Location.Z = 0;
UE_LOG(LogTemp, Warning, TEXT("Client%d MoveTo : (%f, %f)"), GPlayInEditorID, HitResult.Location.X, HitResult.Location.Y);
//UE_LOG(LogTemp, Warning, TEXT("Client%d MoveTo : (%f, %f)"), GPlayInEditorID, HitResult.Location.X, HitResult.Location.Y);
FVector ActorLocation = GetPawn()->GetActorLocation();
ActorLocation.Z = 0;
@@ -376,22 +449,21 @@ FVector ADefaultPlayerController::GetMouseHitLocation()
DrawDebugLine(GetWorld(), HitResult.Location, Destination, FColor::Emerald, false, 1, 0, 1);
const UWorld* CurrentWorld = GetWorld();
if (CurrentWorld)
{
FHitResult CollisionCheck;
if (!CurrentWorld) return Destination;
FCollisionQueryParams CollisionParams;
CollisionParams.AddIgnoredActor(GetPawn());
FHitResult CollisionCheck;
FVector Start = HitResult.Location;
FVector End = Destination;
FCollisionQueryParams CollisionParams;
CollisionParams.AddIgnoredActor(GetPawn());
if (CurrentWorld->LineTraceSingleByChannel(CollisionCheck, Start, End, ECC_Visibility, CollisionParams))
{
DrawDebugLine(CurrentWorld, Start, End, FColor::Red, false, 1.5, 0, 2);
Destination = HitResult.Location;
}
}
FVector Start = HitResult.Location;
FVector End = Destination;
if (!CurrentWorld->LineTraceSingleByChannel(CollisionCheck, Start, End, ECC_Visibility, CollisionParams))
return Destination;
DrawDebugLine(CurrentWorld, Start, End, FColor::Red, false, 1.5, 0, 2);
Destination = HitResult.Location;
return Destination;
}
@@ -476,25 +548,53 @@ void ADefaultPlayerController::SimpleMoveToLocation(AController* Controller, con
void ADefaultPlayerController::OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult& MovementResult)
{
if (MovementResult.IsSuccess())
if (!MovementResult.IsSuccess()) return;
if (!GPlayInEditorID)
{
if (!GPlayInEditorID)
{
UE_LOG(LogTemp, Warning, TEXT("Server MoveCompleted"));
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Client%d MoveCompleted"), GPlayInEditorID);
}
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Idle);
UE_LOG(LogTemp, Warning, TEXT("Server MoveCompleted"));
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Client%d MoveCompleted"), GPlayInEditorID);
}
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Idle);
}
void ADefaultPlayerController::Attack()
void ADefaultPlayerController::Attack(ACharacter* HitObject)
{
UE_LOG(LogTemp, Warning, TEXT("Attack"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Attack);
if (!HitObject) return;
float MinDistance = GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats:: AttackRange];
FVector Destination = HitObject->GetActorLocation(); // HitObject<63><74> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (FVector::Dist(Destination, GetPawn()->GetActorLocation()) <= MinDistance)
{
if ((GetPlayerState<ADefaultPlayerState>()->CooldownDuration[(uint8)CooldownType::Attack] != 0))
return;
FVector Location = GetPawn()->GetActorLocation();
Location.Z = 0;
Server_StopMove();
Multicast_StopMove();
Multicast_SetRotation(GetMouseHitLocation());
Server_SetRotation(GetMouseHitLocation());
UE_LOG(LogTemp, Warning, TEXT("Attack"));
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Attack);
}
else
{
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Moving);
SimpleMoveToLocation(this, Destination);
Destination = HitObject->GetActorLocation(); // HitObject<63><74> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
this->MoveToLocation(Destination);
}
}
void ADefaultPlayerController::MoveToLocation_Implementation(FVector Location)

View File

@@ -34,19 +34,29 @@ public:
void Skill1();
void Skill2();
void Skill3();
void Skill4();
void Skill4Triggered();
void Skill4Completed();
void RuneSpell1();
void RuneSpell2();
void Ward();
void Bomb();
void ObjectSelect();
void MoveTriggered();
void MoveStarted();
void Move();
UFUNCTION(Server, Reliable)
void MoveToLocation(FVector Location);
UFUNCTION(Server, Reliable)
void Server_StopMove();
UFUNCTION(NetMulticast, Reliable)
void Multicast_StopMove();
UFUNCTION(NetMulticast, Reliable)
void Multicast_SetRotation(FVector MouseHitLocation);
UFUNCTION(Server, Reliable)
void Server_SetRotation(FVector MouseHitLocation);
FVector GetMouseHitLocation();
UFUNCTION(BlueprintCallable, Category = "AI|Navigation")
@@ -54,7 +64,9 @@ public:
void OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult &MovementResult);
void Attack();
void Attack(ACharacter* HitObject);
UPROPERTY(BlueprintReadWrite)
float MouseClickInterval;

View File

@@ -26,46 +26,18 @@ void ADefaultPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>&
DOREPLIFETIME(ADefaultPlayerState, PlayerCamera);
}
void ADefaultPlayerState::InitPlayerStats()
void ADefaultPlayerState::InitPlayerStats_Implementation(const TArray<float>& StatsValue, const TArray<float>& CooldownDurationValue)
{
ADefaultPlayerCharacter* Initializer = Cast<ADefaultPlayerCharacter>(CharacterBPRef);
MaxStats.Append(StatsValue);
Stats.Append(StatsValue);
CooldownDuration.Append(CooldownDurationValue);
MaxCooldownDuration.Append(CooldownDurationValue);
Stats.Health = Initializer->GetHealth();
Stats.HPRegeneration = Initializer->GetHPRegeneration();
Stats.HealAndShieldpower = Initializer->GetHealAndShieldpower();
Stats.Armor = Initializer->GetArmor();
Stats.MagicResistance = Initializer->GetMagicResistance();
Stats.Tenacity = Initializer->GetTenacity();
Stats.SlowRisist = Initializer->GetSlowRisist();
Stats.AttackSpeed = Initializer->GetAttackSpeed();
Stats.AttackDamage = Initializer->GetAttackDamage();
Stats.AbilityPower = Initializer->GetAbilityPower();
Stats.CriticalStrikeChance = Initializer->GetCriticalStrikeChance();
Stats.CriticalStrikeDamage = Initializer->GetCriticalStrikeDamage();
Stats.ArmorPenetration = Initializer->GetArmorPenetration();
Stats.MagicPenetration = Initializer->GetMagicPenetration();
Stats.LifeSteal = Initializer->GetLifeSteal();
Stats.PhysicalVamp = Initializer->GetPhysicalVamp();
Stats.Omnivamp = Initializer->GetOmnivamp();
Stats.AbilityHaste = Initializer->GetAbilityHaste();
SetMultipleCooldownDuration(Initializer->GetCooldownDuration());
Stats.Mana = Initializer->GetMana();
Stats.ManaRegeneration = Initializer->GetManaRegeneration();
Stats.Energy = Initializer->GetEnergy();
Stats.EnergyRegeneration = Initializer->GetEnergyRegeneration();
Stats.AttackRange = Initializer->GetAttackRange();
Stats.MovementSpeed = Initializer->GetMovementSpeed();
Stats.GoldGeneration = Initializer->GetGoldGeneration();
Stats.AttackDamageGrowth = Initializer->GetAttackDamageGrowth();
Stats.AttackSpeedGrowth = Initializer->GetAttackSpeedGrowth();
Stats.ArmorGrowth = Initializer->GetArmorGrowth();
Stats.MagicResistanceGrowth = Initializer->GetMagicResistanceGrowth();
Stats.HealthGrowth = Initializer->GetHealthGrowth();
Stats.HealthRegenerationGrowth = Initializer->GetHealthRegenerationGrowth();
Stats.ManaGrowth = Initializer->GetManaGrowth();
Stats.ManaRegenerationGrowth = Initializer->GetManaRegenerationGrowth();
for (float Value : StatsValue)
{
UE_LOG(LogTemp, Warning, TEXT("Values: %f"), Value);
}
}
void ADefaultPlayerState::NetMulticast_SetAttackType_Implementation(CooldownType Value)
@@ -92,8 +64,3 @@ int32 ADefaultPlayerState::GetCharacterLevel() const
{
return int32();
}
void ADefaultPlayerState::SetMultipleCooldownDuration(const float* Value)
{
std::memcpy(&CooldownDuration, Value, sizeof(float) * (uint8)CooldownType::SIZE);
}

View File

@@ -21,7 +21,8 @@ public:
ADefaultPlayerState();
void GetLifetimeReplicatedProps(TArray< FLifetimeProperty >& OutLifetimeProps) const override;
void InitPlayerStats();
UFUNCTION(Server, Reliable)
void InitPlayerStats(const TArray<float>& StatsValue, const TArray<float>& CooldownDurationValue);
void SetCharacterBPRef(UClass* Value) { CharacterBPRef = Value; }
UClass* GetCharacterBPRef() const { return CharacterBPRef; }
@@ -34,10 +35,11 @@ public:
void SetPlayerCamera(AActor* Actor) { PlayerCamera = Actor; }
AActor* GetPlayerCamera() const { return PlayerCamera; }
UFUNCTION(BlueprintCallable)
void SetCooldownDuration(CooldownType Key, float Value) { CooldownDuration[(uint8)Key] = Value; }
UFUNCTION(BlueprintCallable)
float GetCooldownDuration(CooldownType Key) const { return CooldownDuration[(uint8)Key]; }
//fix later
//UFUNCTION(BlueprintCallable)
//void SetCooldownDuration(CooldownType Key, float Value) { CooldownDuration[(uint8)Key] = Value; }
//UFUNCTION(BlueprintCallable)
//float GetCooldownDuration(CooldownType Key) const { return CooldownDuration[(uint8)Key]; }
//Execute on server
UFUNCTION(BlueprintCallable, Server, Reliable)
@@ -58,13 +60,15 @@ public:
UFUNCTION(BlueprintCallable)
int32 GetCharacterLevel() const;
//Should be ONLY executed on server!!
void SetMultipleCooldownDuration(const float* Value) ;
UPROPERTY(Replicated, Transient, EditAnywhere, BlueprintReadWrite)
TArray<float> Stats;
UPROPERTY(Replicated, Transient, EditAnywhere, BlueprintReadWrite)
TArray<float> MaxStats;
UPROPERTY(Replicated, EditAnywhere, BlueprintReadWrite)
FDefaultStats Stats;
UPROPERTY(Replicated, EditAnywhere, BlueprintReadWrite)
FDefaultStats MaxStats;
UPROPERTY(Replicated, Transient, BlueprintReadWrite)
TArray<float> CooldownDuration;
UPROPERTY(Replicated, Transient, BlueprintReadWrite)
TArray<float> MaxCooldownDuration;
private:
UPROPERTY(Replicated, Transient)
@@ -72,9 +76,6 @@ private:
UPROPERTY(Replicated, Transient)
TeamType Team;
UPROPERTY(Replicated, Transient)
float CooldownDuration[(uint8)CooldownType::SIZE] = { 0.0f, };
UPROPERTY(Replicated, Transient)
ECharacterState State;
UPROPERTY(Replicated, Transient)

View File

@@ -1,6 +0,0 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "PerformSkill.h"
// Add default functionality here for any IPerformSkill functions that are not pure virtual.

View File

@@ -1,28 +0,0 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "PerformSkill.generated.h"
// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class UPerformSkill : public UInterface
{
GENERATED_BODY()
};
/**
*
*/
class PROMETHER_API IPerformSkill
{
GENERATED_BODY()
// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
virtual void Skill4Started() = 0;
virtual void Skill4Triggered() = 0;
virtual void Skill4Completed() = 0;
};

View File

@@ -2,7 +2,6 @@
#include "CoreMinimal.h"
#include "DamageType/BaseAttack.h"
#include "DefaultStats.h"
UENUM(BlueprintType)
enum class CharacterType : uint8
@@ -91,3 +90,45 @@ struct FUniqueObjectID
int32 RandomUniqueNumber;
};
UENUM(BlueprintType)
enum class EStats : uint8
{
Health,
HPRegeneration,
HealAndShieldpower,
Armor,
MagicResistance,
Tenacity,
SlowRisist,
AttackSpeed,
AttackDamage,
AbilityPower,
CriticalStrikeChance,
CriticalStrikeDamage,
ArmorPenetration,
MagicPenetration,
LifeSteal,
PhysicalVamp,
Omnivamp,
AbilityHaste,
Mana,
ManaRegeneration,
Energy,
EnergyRegeneration,
AttackRange,
MovementSpeed,
GoldGeneration,
AttackDamageGrowth,
AttackSpeedGrowth,
ArmorGrowth,
MagicResistanceGrowth,
HealthGrowth,
HealthRegenerationGrowth,
ManaGrowth,
ManaRegenerationGrowth,
Skill1Cost,
Skill2Cost,
Skill3Cost,
Skill4Cost,
SIZE
};