Merge branch 'HappyTanuki2' into SJW1024
# Conflicts: # Content/Character/Allium/Alium_Q.uasset # Content/Character/Allium/BP_Allium.uasset # Content/Character/Lb/BP_Lb.uasset # Content/Character/Lb/LB_Q_Arrow.uasset # Content/Character/Riana/BP_Riana.uasset # Content/Maps/DevMap.umap # Source/Promether/GameModeBase/Deathmatch.cpp
This commit is contained in:
BIN
Content/Character/Allium/Alium_Q.uasset
(Stored with Git LFS)
BIN
Content/Character/Allium/Alium_Q.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Character/Allium/BP_Allium.uasset
(Stored with Git LFS)
BIN
Content/Character/Allium/BP_Allium.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Character/Lb/BP_Lb.uasset
(Stored with Git LFS)
BIN
Content/Character/Lb/BP_Lb.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Character/Lb/BaseArrow.uasset
(Stored with Git LFS)
BIN
Content/Character/Lb/BaseArrow.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Character/Lb/LB_Q_Arrow.uasset
(Stored with Git LFS)
BIN
Content/Character/Lb/LB_Q_Arrow.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Effect/ETC/Hit_Nomal.uasset
(Stored with Git LFS)
BIN
Content/Effect/ETC/Hit_Nomal.uasset
(Stored with Git LFS)
Binary file not shown.
@@ -1,5 +1,5 @@
|
|||||||
// Fill out your copyright notice in the Description page of Project Settings.
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
#include "DamageType/ApDamage.h"
|
#include "APDamage.h"
|
||||||
|
|
||||||
@@ -4,13 +4,13 @@
|
|||||||
|
|
||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
#include "GameFramework/DamageType.h"
|
#include "GameFramework/DamageType.h"
|
||||||
#include "ApDamage.generated.h"
|
#include "APDamage.generated.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
UCLASS()
|
UCLASS()
|
||||||
class PROMETHER_API UApDamage : public UDamageType
|
class PROMETHER_API UAPDamage : public UDamageType
|
||||||
{
|
{
|
||||||
GENERATED_BODY()
|
GENERATED_BODY()
|
||||||
|
|
||||||
47
Source/Promether/DamageType/HomingAttack.cpp
Normal file
47
Source/Promether/DamageType/HomingAttack.cpp
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "HomingAttack.h"
|
||||||
|
#include "../PlayerGeneric/DefaultPlayerCharacter.h"
|
||||||
|
#include "../PlayerGeneric/DefaultPlayerState.h"
|
||||||
|
#include "Kismet/KismetMathLibrary.h"
|
||||||
|
|
||||||
|
// Sets default values
|
||||||
|
AHomingAttack::AHomingAttack()
|
||||||
|
{
|
||||||
|
// 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;
|
||||||
|
ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovement"));
|
||||||
|
ProjectileMovement->InitialSpeed = 0;
|
||||||
|
ProjectileMovement->MaxSpeed = 1000;
|
||||||
|
ProjectileMovement->ProjectileGravityScale = 0;
|
||||||
|
ProjectileMovement->bIsHomingProjectile = true;
|
||||||
|
ProjectileMovement->HomingAccelerationMagnitude = 10000;
|
||||||
|
ProjectileMovement->Velocity = { 0, 0, 0 };
|
||||||
|
ProjectileMovement->bRotationFollowsVelocity = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the game starts or when spawned
|
||||||
|
void AHomingAttack::BeginPlay()
|
||||||
|
{
|
||||||
|
Super::BeginPlay();
|
||||||
|
|
||||||
|
ADefaultPlayerState* State = Cast<APawn>(GetOwner())->GetPlayerState<ADefaultPlayerState>();
|
||||||
|
if (!State) return;
|
||||||
|
if (!State->GetCurrentAttackTarget())
|
||||||
|
{
|
||||||
|
UE_LOG(LogTemp, Error, TEXT("No Target"));
|
||||||
|
Destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Target = State->GetCurrentAttackTarget();
|
||||||
|
ProjectileMovement->HomingTargetComponent = Target->GetRootComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called every frame
|
||||||
|
void AHomingAttack::Tick(float DeltaTime)
|
||||||
|
{
|
||||||
|
Super::Tick(DeltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
33
Source/Promether/DamageType/HomingAttack.h
Normal file
33
Source/Promether/DamageType/HomingAttack.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "GameFramework/Actor.h"
|
||||||
|
#include "GameFramework/ProjectileMovementComponent.h"
|
||||||
|
#include "HomingAttack.generated.h"
|
||||||
|
|
||||||
|
UCLASS()
|
||||||
|
class PROMETHER_API AHomingAttack : public AActor
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Sets default values for this actor's properties
|
||||||
|
AHomingAttack();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Called when the game starts or when spawned
|
||||||
|
virtual void BeginPlay() override;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
UProjectileMovementComponent* ProjectileMovement;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
AActor* Target;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Called every frame
|
||||||
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
};
|
||||||
33
Source/Promether/DefaultAIController.cpp
Normal file
33
Source/Promether/DefaultAIController.cpp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
|
||||||
|
#include "DefaultAIController.h"
|
||||||
|
#include "PlayerGeneric/DefaultPlayerState.h"
|
||||||
|
#include "PlayerGeneric/DefaultPlayerCharacter.h"
|
||||||
|
|
||||||
|
ADefaultAIController::ADefaultAIController()
|
||||||
|
{
|
||||||
|
bWantsPlayerState = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultAIController::OnPossess(APawn* aPawn)
|
||||||
|
{
|
||||||
|
//debug
|
||||||
|
FString MyName = aPawn->GetName();
|
||||||
|
|
||||||
|
ADefaultPlayerState* MyPlayerState = GetPlayerState<ADefaultPlayerState>();
|
||||||
|
if (!MyPlayerState) return;
|
||||||
|
|
||||||
|
ADefaultPlayerCharacter* ControlledPawn = Cast<ADefaultPlayerCharacter>(aPawn);
|
||||||
|
if (!ControlledPawn) return;
|
||||||
|
|
||||||
|
ControlledPawn->SetPlayerState(MyPlayerState);
|
||||||
|
|
||||||
|
TArray<float> DefaultStatsValue;
|
||||||
|
TArray<float> CooldownDurationValue;
|
||||||
|
|
||||||
|
ControlledPawn->DefaultStats.GenerateValueArray(DefaultStatsValue);
|
||||||
|
ControlledPawn->CooldownDuration.GenerateValueArray(CooldownDurationValue);
|
||||||
|
|
||||||
|
MyPlayerState->InitPlayerStats(DefaultStatsValue, CooldownDurationValue);
|
||||||
|
}
|
||||||
21
Source/Promether/DefaultAIController.h
Normal file
21
Source/Promether/DefaultAIController.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
// Fill out your copyright notice in the Description page of Project Settings.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "AIController.h"
|
||||||
|
#include "DefaultAIController.generated.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
UCLASS()
|
||||||
|
class PROMETHER_API ADefaultAIController : public AAIController
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
ADefaultAIController();
|
||||||
|
void OnPossess(APawn* aPawn) override;
|
||||||
|
|
||||||
|
};
|
||||||
@@ -133,7 +133,7 @@ FString ADeathmatch::InitNewPlayer(APlayerController* NewPlayerController, const
|
|||||||
//DebugPerpose
|
//DebugPerpose
|
||||||
if (Type == CharacterType::Lukriel)
|
if (Type == CharacterType::Lukriel)
|
||||||
{
|
{
|
||||||
Type = CharacterType::Riana;
|
Type = CharacterType::Lb;
|
||||||
}
|
}
|
||||||
if (Team == TeamType::Null)
|
if (Team == TeamType::Null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,8 +3,10 @@
|
|||||||
|
|
||||||
#include "DefaultPlayerCharacter.h"
|
#include "DefaultPlayerCharacter.h"
|
||||||
#include "DefaultPlayerState.h"
|
#include "DefaultPlayerState.h"
|
||||||
|
#include "../DefaultAIController.h"
|
||||||
#include "Engine/DamageEvents.h"
|
#include "Engine/DamageEvents.h"
|
||||||
#include "Kismet/GameplayStatics.h"
|
#include "Kismet/GameplayStatics.h"
|
||||||
|
#include "Components/CapsuleComponent.h"
|
||||||
|
|
||||||
ADefaultPlayerCharacter::ADefaultPlayerCharacter()
|
ADefaultPlayerCharacter::ADefaultPlayerCharacter()
|
||||||
{
|
{
|
||||||
@@ -13,6 +15,9 @@ ADefaultPlayerCharacter::ADefaultPlayerCharacter()
|
|||||||
SetCanBeDamaged(true);
|
SetCanBeDamaged(true);
|
||||||
bUseControllerRotationYaw = false;
|
bUseControllerRotationYaw = false;
|
||||||
|
|
||||||
|
AIControllerClass = ADefaultAIController::StaticClass();
|
||||||
|
AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;
|
||||||
|
|
||||||
CameraSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
|
CameraSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
|
||||||
CameraSpringArm->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, 0.0f), FRotator(-45.0f, 0.0f, 0.0f));
|
CameraSpringArm->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, 0.0f), FRotator(-45.0f, 0.0f, 0.0f));
|
||||||
CameraSpringArm->SetAbsolute(false, true, true);
|
CameraSpringArm->SetAbsolute(false, true, true);
|
||||||
@@ -49,11 +54,10 @@ void ADefaultPlayerCharacter::Tick(float DeltaTime)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ADefaultPlayerCharacter::Attack_Implementation()
|
void ADefaultPlayerCharacter::Attack_Implementation()
|
||||||
{
|
{
|
||||||
NetMulticast_Attack();
|
NetMulticast_Attack();
|
||||||
|
BP_Attack();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADefaultPlayerCharacter::NetMulticast_Attack_Implementation()
|
void ADefaultPlayerCharacter::NetMulticast_Attack_Implementation()
|
||||||
@@ -108,7 +112,8 @@ float ADefaultPlayerCharacter::TakeDamage_Implementation(float DamageAmount, str
|
|||||||
if (UpdatedHealth < 0 || UpdatedHealth < 0.1 )
|
if (UpdatedHealth < 0 || UpdatedHealth < 0.1 )
|
||||||
{
|
{
|
||||||
State->Stats[(uint8)EStats::Health] = 0;
|
State->Stats[(uint8)EStats::Health] = 0;
|
||||||
|
Server_PerformDead();
|
||||||
|
Client_PerformDead();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -116,13 +121,10 @@ float ADefaultPlayerCharacter::TakeDamage_Implementation(float DamageAmount, str
|
|||||||
}
|
}
|
||||||
|
|
||||||
UE_LOG(LogTemp, Warning, TEXT("Current Health : %f"), State->Stats[(uint8)EStats::Health]);
|
UE_LOG(LogTemp, Warning, TEXT("Current Health : %f"), State->Stats[(uint8)EStats::Health]);
|
||||||
UE_LOG(LogTemp, Warning, TEXT("U Health : %f"), UpdatedHealth);
|
|
||||||
|
|
||||||
return ReturnValue;
|
return ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ADefaultPlayerCharacter::Skill1_Implementation()
|
void ADefaultPlayerCharacter::Skill1_Implementation()
|
||||||
{
|
{
|
||||||
NetMulticast_Skill1();
|
NetMulticast_Skill1();
|
||||||
@@ -202,3 +204,23 @@ void ADefaultPlayerCharacter::NetMulticast_Skill7_Implementation()
|
|||||||
{
|
{
|
||||||
BP_Skill7();
|
BP_Skill7();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerCharacter::PerformDead()
|
||||||
|
{
|
||||||
|
ADefaultPlayerState* State = GetPlayerState<ADefaultPlayerState>();
|
||||||
|
if (!State) return;
|
||||||
|
|
||||||
|
State->SetState(ECharacterState::Dead);
|
||||||
|
GetCapsuleComponent()->SetGenerateOverlapEvents(false);
|
||||||
|
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerCharacter::Server_PerformDead_Implementation()
|
||||||
|
{
|
||||||
|
PerformDead();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerCharacter::Client_PerformDead_Implementation()
|
||||||
|
{
|
||||||
|
PerformDead();
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ public:
|
|||||||
void BP_Attack();
|
void BP_Attack();
|
||||||
UFUNCTION(NetMulticast, Reliable)
|
UFUNCTION(NetMulticast, Reliable)
|
||||||
void NetMulticast_Attack();
|
void NetMulticast_Attack();
|
||||||
|
|
||||||
UFUNCTION(BlueprintNativeEvent)
|
UFUNCTION(BlueprintNativeEvent)
|
||||||
float TakeDamage( float Damage,
|
float TakeDamage( float Damage,
|
||||||
struct FDamageEvent const& DamageEvent,
|
struct FDamageEvent const& DamageEvent,
|
||||||
@@ -35,7 +36,13 @@ public:
|
|||||||
AActor* DamageCauser ) override;
|
AActor* DamageCauser ) override;
|
||||||
|
|
||||||
|
|
||||||
|
void PerformDead();
|
||||||
|
|
||||||
|
UFUNCTION(Client, Reliable)
|
||||||
|
void Client_PerformDead();
|
||||||
|
|
||||||
|
UFUNCTION(Server, Reliable)
|
||||||
|
void Server_PerformDead();
|
||||||
|
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Server, Reliable)
|
UFUNCTION(BlueprintCallable, Server, Reliable)
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ void ADefaultPlayerController::Server_SpawnPlayerCamera_Implementation()
|
|||||||
|
|
||||||
void ADefaultPlayerController::SetACharacterOutlineColor(ACharacter* Target, bool Visible)
|
void ADefaultPlayerController::SetACharacterOutlineColor(ACharacter* Target, bool Visible)
|
||||||
{
|
{
|
||||||
if (HasAuthority()) return;
|
if (!Target) return;
|
||||||
|
|
||||||
ADefaultPlayerState* State = Target->GetPlayerState<ADefaultPlayerState>();
|
ADefaultPlayerState* State = Target->GetPlayerState<ADefaultPlayerState>();
|
||||||
if (!State)
|
if (!State)
|
||||||
@@ -330,9 +330,9 @@ void ADefaultPlayerController::Skill3()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ADefaultPlayerController::Skill4Triggered()
|
void ADefaultPlayerController::Skill4Triggered()
|
||||||
{//<2F><>Ÿ<EFBFBD><C5B8> üũ <20>ֱ<EFBFBD>
|
{//<2F><>Ÿ<EFBFBD><C5B8> üũ <20>ֱ<EFBFBD>
|
||||||
|
|
||||||
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::charging] == 0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true<75><65> <20>ƴ<EFBFBD> <20><>
|
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::charging] == 0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true<75><65> <20>ƴ<EFBFBD> <20><>
|
||||||
{
|
{
|
||||||
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Skillusable] == 0) {
|
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Skillusable] == 0) {
|
||||||
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Idle);
|
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Idle);
|
||||||
@@ -422,48 +422,51 @@ void ADefaultPlayerController::Bomb()
|
|||||||
|
|
||||||
void ADefaultPlayerController::ObjectSelect()
|
void ADefaultPlayerController::ObjectSelect()
|
||||||
{
|
{
|
||||||
|
ADefaultPlayerState* State = GetPlayerState<ADefaultPlayerState>();
|
||||||
|
if (!State) return;
|
||||||
|
|
||||||
FHitResult HitResult;
|
FHitResult HitResult;
|
||||||
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
|
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
|
||||||
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
|
|
||||||
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
|
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
|
||||||
|
|
||||||
GetHitResultUnderCursorForObjects(ObjectTypes, true, HitResult);
|
GetHitResultUnderCursorForObjects(ObjectTypes, true, HitResult);
|
||||||
|
|
||||||
ACharacter* HitObject = Cast<ACharacter>(HitResult.GetActor());
|
ACharacter* HitObject = Cast<ACharacter>(HitResult.GetActor());
|
||||||
if (!HitObject) return;
|
|
||||||
|
|
||||||
UE_LOG(LogTemp, Warning, TEXT("%s"), *HitObject->GetName());
|
if (!HitObject)
|
||||||
|
{
|
||||||
|
SetACharacterOutlineColor(Cast<ACharacter>(State->GetPreviousAttackTarget()), false);
|
||||||
|
State->SetPreviousAttackTarget(nullptr);
|
||||||
|
State->SetCurrentAttackTarget(nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (State->GetPreviousAttackTarget() != HitResult.GetActor())
|
||||||
|
{
|
||||||
|
SetACharacterOutlineColor(Cast<ACharacter>(State->GetPreviousAttackTarget()), false);
|
||||||
|
|
||||||
|
State->SetPreviousAttackTarget(HitResult.GetActor());
|
||||||
|
State->SetCurrentAttackTarget(HitResult.GetActor());
|
||||||
|
|
||||||
SetACharacterOutlineColor(HitObject, true);
|
SetACharacterOutlineColor(HitObject, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UE_LOG(LogTemp, Warning, TEXT("%s"), *State->GetCurrentAttackTarget()->GetName());
|
||||||
|
|
||||||
|
FString Name = HitResult.GetActor()->GetName();
|
||||||
|
APlayerState* TargetState = Cast<APawn>(HitResult.GetActor())->GetPlayerState();
|
||||||
|
}
|
||||||
|
|
||||||
void ADefaultPlayerController::Move()
|
void ADefaultPlayerController::Move()
|
||||||
{
|
{
|
||||||
EndAttack();
|
EndAttack();
|
||||||
FHitResult HitResult;
|
ObjectSelect();
|
||||||
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
|
|
||||||
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
|
|
||||||
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
|
|
||||||
|
|
||||||
GetHitResultUnderCursorForObjects(ObjectTypes, true, HitResult);
|
if (GetPlayerState<ADefaultPlayerState>()->GetCurrentAttackTarget() != GetPawn<AActor>() &&
|
||||||
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>
|
Cast<ADefaultPlayerCharacter>(GetPlayerState<ADefaultPlayerState>()->GetCurrentAttackTarget()))
|
||||||
HitTarget = HitResult.GetActor();
|
|
||||||
|
|
||||||
UE_LOG(LogTemp, Warning, TEXT("%s"), *HitResult.GetActor()->GetName());
|
|
||||||
|
|
||||||
if (HitResult.GetActor() != GetPawn<AActor>()) //<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>
|
|
||||||
{
|
{
|
||||||
if (GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Attackable] == 1)
|
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Attackable] == 0) return;
|
||||||
return;
|
BeginAttack();
|
||||||
if (!HitCharacter)
|
|
||||||
{
|
|
||||||
FVector Destination = GetMouseHitLocation();
|
|
||||||
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Moving);
|
|
||||||
SimpleMoveToLocation(this, Destination);
|
|
||||||
this->MoveToLocation(Destination);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BeginAttack(); //HitObject<63><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BeginAttack <20><><EFBFBD><EFBFBD>
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -484,8 +487,6 @@ void ADefaultPlayerController::Multicast_SetRotation_Implementation(FVector Mous
|
|||||||
|
|
||||||
FRotator NewRotation = (MouseHitLocation - Location).Rotation();
|
FRotator NewRotation = (MouseHitLocation - Location).Rotation();
|
||||||
|
|
||||||
// <20><><EFBFBD><EFBFBD> X<><58><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ʹٸ<CDB4> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
|
||||||
|
|
||||||
NewRotation.Pitch = 0;
|
NewRotation.Pitch = 0;
|
||||||
|
|
||||||
GetPawn()->SetActorRotation(NewRotation);
|
GetPawn()->SetActorRotation(NewRotation);
|
||||||
@@ -517,7 +518,10 @@ void ADefaultPlayerController::Multicast_StopMove_Implementation()
|
|||||||
FVector ADefaultPlayerController::GetMouseHitLocation()
|
FVector ADefaultPlayerController::GetMouseHitLocation()
|
||||||
{
|
{
|
||||||
FHitResult HitResult;
|
FHitResult HitResult;
|
||||||
GetHitResultUnderCursor(ECollisionChannel::ECC_Visibility, true, HitResult);
|
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;
|
||||||
|
ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
|
||||||
|
|
||||||
|
GetHitResultUnderCursorForObjects(ObjectTypes, true, HitResult);
|
||||||
HitResult.Location.Z = 0;
|
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);
|
||||||
@@ -646,8 +650,6 @@ void ADefaultPlayerController::OnMoveCompleted(FAIRequestID RequestID, const FPa
|
|||||||
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Idle);
|
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Idle);
|
||||||
}
|
}
|
||||||
|
|
||||||
FTimerHandle TimerHandle;
|
|
||||||
|
|
||||||
void ADefaultPlayerController::BeginAttack()
|
void ADefaultPlayerController::BeginAttack()
|
||||||
{
|
{
|
||||||
GetWorldTimerManager().SetTimer(TimerHandle, this, &ADefaultPlayerController::RepeatedAttack, 0.1f, true);
|
GetWorldTimerManager().SetTimer(TimerHandle, this, &ADefaultPlayerController::RepeatedAttack, 0.1f, true);
|
||||||
@@ -655,31 +657,30 @@ void ADefaultPlayerController::BeginAttack()
|
|||||||
|
|
||||||
void ADefaultPlayerController::EndAttack()
|
void ADefaultPlayerController::EndAttack()
|
||||||
{
|
{
|
||||||
|
|
||||||
GetWorldTimerManager().ClearTimer(TimerHandle);
|
GetWorldTimerManager().ClearTimer(TimerHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADefaultPlayerController::RepeatedAttack()
|
void ADefaultPlayerController::RepeatedAttack()
|
||||||
{
|
{
|
||||||
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Attackable] == 0)
|
|
||||||
return;
|
|
||||||
Attack();
|
Attack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ADefaultPlayerController::Attack()
|
void ADefaultPlayerController::Attack()
|
||||||
{
|
{
|
||||||
|
if (!GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats::Attackable] == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
float MinDistance = GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats:: AttackRange];
|
float MinDistance = GetPlayerState<ADefaultPlayerState>()->Stats[(uint8)EStats:: AttackRange];
|
||||||
FVector Destination = HitTarget->GetActorLocation(); // HitObject<63><74> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
||||||
|
if (!GetPlayerState<ADefaultPlayerState>()->GetCurrentAttackTarget()) return;
|
||||||
|
|
||||||
|
FVector Destination = GetPlayerState<ADefaultPlayerState>()->GetCurrentAttackTarget()->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 (FVector::Dist(Destination, GetPawn()->GetActorLocation()) <= MinDistance)
|
||||||
{
|
{
|
||||||
if ((GetPlayerState<ADefaultPlayerState>()->CooldownDuration[(uint8)CooldownType::Attack] != 0))
|
if ((GetPlayerState<ADefaultPlayerState>()->CooldownDuration[(uint8)CooldownType::Attack] != 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
FVector Location = GetPawn()->GetActorLocation();
|
FVector Location = GetPawn()->GetActorLocation();
|
||||||
Location.X = 0;
|
Location.X = 0;
|
||||||
|
|
||||||
@@ -689,7 +690,6 @@ void ADefaultPlayerController::Attack()
|
|||||||
Multicast_SetRotation(Destination);
|
Multicast_SetRotation(Destination);
|
||||||
Server_SetRotation(Destination);
|
Server_SetRotation(Destination);
|
||||||
|
|
||||||
|
|
||||||
UE_LOG(LogTemp, Warning, TEXT("Attack"));
|
UE_LOG(LogTemp, Warning, TEXT("Attack"));
|
||||||
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
|
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Attack);
|
||||||
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Attack);
|
GetPlayerState<ADefaultPlayerState>()->SetAttackType(CooldownType::Attack);
|
||||||
@@ -698,12 +698,8 @@ void ADefaultPlayerController::Attack()
|
|||||||
{
|
{
|
||||||
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Moving);
|
GetPlayerState<ADefaultPlayerState>()->SetState(ECharacterState::Moving);
|
||||||
SimpleMoveToLocation(this, Destination);
|
SimpleMoveToLocation(this, Destination);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this->MoveToLocation(Destination);
|
this->MoveToLocation(Destination);
|
||||||
}
|
}
|
||||||
SetTarget();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADefaultPlayerController::MoveToLocation_Implementation(FVector Location)
|
void ADefaultPlayerController::MoveToLocation_Implementation(FVector Location)
|
||||||
|
|||||||
@@ -77,9 +77,7 @@ public:
|
|||||||
UPROPERTY(BlueprintReadWrite)
|
UPROPERTY(BlueprintReadWrite)
|
||||||
float MouseClickInterval;
|
float MouseClickInterval;
|
||||||
|
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "My Actor")
|
FTimerHandle TimerHandle;
|
||||||
AActor* HitTarget;
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UPROPERTY(EditAnywhere, Category = "Input")
|
UPROPERTY(EditAnywhere, Category = "Input")
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ ADefaultPlayerState::ADefaultPlayerState()
|
|||||||
CharacterBPRef = nullptr;;
|
CharacterBPRef = nullptr;;
|
||||||
Team = TeamType::Null;
|
Team = TeamType::Null;
|
||||||
State = ECharacterState::Idle;
|
State = ECharacterState::Idle;
|
||||||
|
|
||||||
|
NetUpdateFrequency = 100.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADefaultPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
|
void ADefaultPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
|
||||||
@@ -22,8 +24,10 @@ void ADefaultPlayerState::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>&
|
|||||||
|
|
||||||
DOREPLIFETIME(ADefaultPlayerState, State);
|
DOREPLIFETIME(ADefaultPlayerState, State);
|
||||||
DOREPLIFETIME(ADefaultPlayerState, AttackType);
|
DOREPLIFETIME(ADefaultPlayerState, AttackType);
|
||||||
//DOREPLIFETIME(ADefaultPlayerState, StatusEffectObject);
|
|
||||||
DOREPLIFETIME(ADefaultPlayerState, PlayerCamera);
|
DOREPLIFETIME(ADefaultPlayerState, PlayerCamera);
|
||||||
|
|
||||||
|
DOREPLIFETIME(ADefaultPlayerState, CurrentAttackTarget);
|
||||||
|
DOREPLIFETIME(ADefaultPlayerState, PreviousAttackTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADefaultPlayerState::InitPlayerStats_Implementation(const TArray<float>& StatsValue, const TArray<float>& CooldownDurationValue)
|
void ADefaultPlayerState::InitPlayerStats_Implementation(const TArray<float>& StatsValue, const TArray<float>& CooldownDurationValue)
|
||||||
@@ -33,7 +37,6 @@ void ADefaultPlayerState::InitPlayerStats_Implementation(const TArray<float>& St
|
|||||||
CooldownDuration.Append(CooldownDurationValue);
|
CooldownDuration.Append(CooldownDurationValue);
|
||||||
MaxCooldownDuration.Append(CooldownDurationValue);
|
MaxCooldownDuration.Append(CooldownDurationValue);
|
||||||
|
|
||||||
|
|
||||||
for (float Value : StatsValue)
|
for (float Value : StatsValue)
|
||||||
{
|
{
|
||||||
UE_LOG(LogTemp, Warning, TEXT("Values: %f"), Value);
|
UE_LOG(LogTemp, Warning, TEXT("Values: %f"), Value);
|
||||||
@@ -64,3 +67,35 @@ int32 ADefaultPlayerState::GetCharacterLevel() const
|
|||||||
{
|
{
|
||||||
return int32();
|
return int32();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerState::SetCurrentAttackTarget(AActor* Target)
|
||||||
|
{
|
||||||
|
Server_SetCurrentAttackTarget(Target);
|
||||||
|
Client_SetCurrentAttackTarget(Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerState::Server_SetCurrentAttackTarget_Implementation(AActor* Target)
|
||||||
|
{
|
||||||
|
CurrentAttackTarget = Target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerState::Client_SetCurrentAttackTarget_Implementation(AActor* Target)
|
||||||
|
{
|
||||||
|
CurrentAttackTarget = Target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerState::SetPreviousAttackTarget(AActor* Target)
|
||||||
|
{
|
||||||
|
Server_SetPreviousAttackTarget(Target);
|
||||||
|
Client_SetPreviousAttackTarget(Target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerState::Server_SetPreviousAttackTarget_Implementation(AActor* Target)
|
||||||
|
{
|
||||||
|
PreviousAttackTarget = Target;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADefaultPlayerState::Client_SetPreviousAttackTarget_Implementation(AActor* Target)
|
||||||
|
{
|
||||||
|
PreviousAttackTarget = Target;
|
||||||
|
}
|
||||||
|
|||||||
@@ -63,6 +63,23 @@ public:
|
|||||||
UFUNCTION(BlueprintCallable)
|
UFUNCTION(BlueprintCallable)
|
||||||
int32 GetCharacterLevel() const;
|
int32 GetCharacterLevel() const;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
AActor* GetCurrentAttackTarget() const { return CurrentAttackTarget; };
|
||||||
|
UFUNCTION(BlueprintCallable)
|
||||||
|
AActor* GetPreviousAttackTarget() const { return PreviousAttackTarget; };
|
||||||
|
|
||||||
|
void SetCurrentAttackTarget(AActor* Target);
|
||||||
|
UFUNCTION(Server, Reliable)
|
||||||
|
void Server_SetCurrentAttackTarget(AActor* Target);
|
||||||
|
UFUNCTION(Client, Reliable)
|
||||||
|
void Client_SetCurrentAttackTarget(AActor* Target);
|
||||||
|
|
||||||
|
void SetPreviousAttackTarget(AActor* Target);
|
||||||
|
UFUNCTION(Server, Reliable)
|
||||||
|
void Server_SetPreviousAttackTarget(AActor* Target);
|
||||||
|
UFUNCTION(Client, Reliable)
|
||||||
|
void Client_SetPreviousAttackTarget(AActor* Target);
|
||||||
|
|
||||||
UPROPERTY(Replicated, Transient, EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(Replicated, Transient, EditAnywhere, BlueprintReadWrite)
|
||||||
TArray<float> Stats;
|
TArray<float> Stats;
|
||||||
UPROPERTY(Replicated, Transient, EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(Replicated, Transient, EditAnywhere, BlueprintReadWrite)
|
||||||
@@ -73,6 +90,7 @@ public:
|
|||||||
UPROPERTY(Replicated, Transient, BlueprintReadWrite)
|
UPROPERTY(Replicated, Transient, BlueprintReadWrite)
|
||||||
TArray<float> MaxCooldownDuration;
|
TArray<float> MaxCooldownDuration;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UPROPERTY(Replicated, Transient)
|
UPROPERTY(Replicated, Transient)
|
||||||
UClass* CharacterBPRef;
|
UClass* CharacterBPRef;
|
||||||
@@ -84,9 +102,11 @@ private:
|
|||||||
UPROPERTY(Replicated, Transient)
|
UPROPERTY(Replicated, Transient)
|
||||||
CooldownType AttackType;
|
CooldownType AttackType;
|
||||||
|
|
||||||
//UPROPERTY(Replicated, Transient)
|
|
||||||
//TMap<FUniqueObjectID, UStatusEffect> StatusEffectObject;
|
|
||||||
|
|
||||||
UPROPERTY(Replicated, Transient)
|
UPROPERTY(Replicated, Transient)
|
||||||
AActor* PlayerCamera;
|
AActor* PlayerCamera;
|
||||||
|
|
||||||
|
UPROPERTY(Replicated, Transient)
|
||||||
|
AActor* CurrentAttackTarget;
|
||||||
|
UPROPERTY(Replicated, Transient)
|
||||||
|
AActor* PreviousAttackTarget;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "CoreMinimal.h"
|
#include "CoreMinimal.h"
|
||||||
|
|
||||||
#include "DamageType/BaseAttack.h"
|
#include "DamageType/BaseAttack.h"
|
||||||
|
#include "DamageType/APDamage.h"
|
||||||
|
|
||||||
UENUM(BlueprintType)
|
UENUM(BlueprintType)
|
||||||
enum class CharacterType : uint8
|
enum class CharacterType : uint8
|
||||||
|
|||||||
Reference in New Issue
Block a user