diff --git a/Content/BattleField/BattleFieldMap.umap b/Content/BattleField/BattleFieldMap.umap index 1a419bd..80cd99c 100644 Binary files a/Content/BattleField/BattleFieldMap.umap and b/Content/BattleField/BattleFieldMap.umap differ diff --git a/Content/Troopers/BP_DefaultProjectile.uasset b/Content/Troopers/BP_DefaultProjectile.uasset deleted file mode 100644 index 6c90094..0000000 Binary files a/Content/Troopers/BP_DefaultProjectile.uasset and /dev/null differ diff --git a/Content/Troopers/BP_Trooper.uasset b/Content/Troopers/BP_Trooper.uasset index d47ed93..7b9e42d 100644 Binary files a/Content/Troopers/BP_Trooper.uasset and b/Content/Troopers/BP_Trooper.uasset differ diff --git a/Content/Troopers/MyMyProjectile.uasset b/Content/Troopers/MyMyProjectile.uasset deleted file mode 100644 index 09044c9..0000000 Binary files a/Content/Troopers/MyMyProjectile.uasset and /dev/null differ diff --git a/Content/Troopers/TrooperSkeletonMelee.uasset b/Content/Troopers/TrooperSkeletonMelee.uasset index 1496a7a..91c9c3c 100644 Binary files a/Content/Troopers/TrooperSkeletonMelee.uasset and b/Content/Troopers/TrooperSkeletonMelee.uasset differ diff --git a/Content/Troopers/TrooperWizard.uasset b/Content/Troopers/TrooperWizard.uasset index 76c7053..09c2e99 100644 Binary files a/Content/Troopers/TrooperWizard.uasset and b/Content/Troopers/TrooperWizard.uasset differ diff --git a/Content/Troopers/WBP_HealthBar.uasset b/Content/Troopers/WBP_HealthBar.uasset index 053eef5..2c2d067 100644 Binary files a/Content/Troopers/WBP_HealthBar.uasset and b/Content/Troopers/WBP_HealthBar.uasset differ diff --git a/Content/Troopers/projectiles/BP_DefaultProjectile.uasset b/Content/Troopers/projectiles/BP_DefaultProjectile.uasset new file mode 100644 index 0000000..18875aa Binary files /dev/null and b/Content/Troopers/projectiles/BP_DefaultProjectile.uasset differ diff --git a/Content/Troopers/projectiles/BP_Fireball.uasset b/Content/Troopers/projectiles/BP_Fireball.uasset new file mode 100644 index 0000000..3a5feb6 Binary files /dev/null and b/Content/Troopers/projectiles/BP_Fireball.uasset differ diff --git a/Content/Troopers/projectiles/BP_MyExplosion.uasset b/Content/Troopers/projectiles/BP_MyExplosion.uasset new file mode 100644 index 0000000..06ea15c Binary files /dev/null and b/Content/Troopers/projectiles/BP_MyExplosion.uasset differ diff --git a/Content/Troopers/projectiles/Materials/Fire_Material.uasset b/Content/Troopers/projectiles/Materials/Fire_Material.uasset new file mode 100644 index 0000000..86dede3 Binary files /dev/null and b/Content/Troopers/projectiles/Materials/Fire_Material.uasset differ diff --git a/Content/Troopers/projectiles/MyMyExplosion.uasset b/Content/Troopers/projectiles/MyMyExplosion.uasset new file mode 100644 index 0000000..52cfe7a Binary files /dev/null and b/Content/Troopers/projectiles/MyMyExplosion.uasset differ diff --git a/Source/TurnBasedTutorial/MyExplosion.cpp b/Source/TurnBasedTutorial/MyExplosion.cpp new file mode 100644 index 0000000..4d3caf1 --- /dev/null +++ b/Source/TurnBasedTutorial/MyExplosion.cpp @@ -0,0 +1,68 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "MyExplosion.h" + +#include "Trooper.h" +#include "Components/SphereComponent.h" +#include "Net/UnrealNetwork.h" +#include "Particles/ParticleSystemComponent.h" + +AMyExplosion::AMyExplosion() { + // if (!CollisionComponent) { + // CollisionComponent = CreateDefaultSubobject( + // TEXT("SphereComponent")); + // RootComponent = CollisionComponent; + // } + if (!ParticleSystemComponent) { + ParticleSystemComponent = CreateDefaultSubobject< + UParticleSystemComponent>( + TEXT("ParticleSystemComponent")); + RootComponent = ParticleSystemComponent; + } + InitialLifeSpan = 1.0f; +} + +void AMyExplosion::Initialize(float damage, + float splashRadius, + uint8 playerIndex) { + Damage = damage; + PlayerIndex = playerIndex; + float Scale = splashRadius / 50; + // CollisionComponent->SetWorldScale3D({Scale, Scale, Scale}); + if (ParticleSystemComponent && ParticleSystemComponent->IsValidLowLevel()) { + ParticleSystemComponent->SetWorldScale3D({Scale, Scale, Scale}); + } +} + +void AMyExplosion::BeginPlay() { + Super::BeginPlay(); +} + +void AMyExplosion::NotifyActorBeginOverlap(AActor *OtherActor) { + Super::NotifyActorBeginOverlap(OtherActor); + ATrooper *OtherTrooper = Cast(OtherActor); + if (OtherTrooper) { + UE_LOG(LogTemp, Warning, + TEXT( + "Begin explosion overlap: id: %d, index: %d, damage: %f, my index: %d" + ), + OtherTrooper->GetId(), OtherTrooper->GetPlayerIndex(), Damage, + PlayerIndex); + if (PlayerIndex != -1 && PlayerIndex != OtherTrooper-> + GetPlayerIndex()) { + OtherTrooper->TakeDamage(Damage); + } + } else { + UE_LOG(LogTemp, Warning, TEXT("Overlapped not a trooper")); + } +} + +void AMyExplosion::GetLifetimeReplicatedProps( + TArray &OutLifetimeProps) const { + Super::GetLifetimeReplicatedProps(OutLifetimeProps); + DOREPLIFETIME(AMyExplosion, Damage); + DOREPLIFETIME(AMyExplosion, PlayerIndex); + // DOREPLIFETIME(AMyExplosion, CollisionComponent); + DOREPLIFETIME(AMyExplosion, ParticleSystemComponent); +} diff --git a/Source/TurnBasedTutorial/MyExplosion.h b/Source/TurnBasedTutorial/MyExplosion.h new file mode 100644 index 0000000..535cf0f --- /dev/null +++ b/Source/TurnBasedTutorial/MyExplosion.h @@ -0,0 +1,37 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "Components/SphereComponent.h" +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "MyExplosion.generated.h" + +UCLASS() +class TURNBASEDTUTORIAL_API AMyExplosion : public AActor { + GENERATED_BODY() + +public: + AMyExplosion(); + + void Initialize(float damage, + float splashRadius, + uint8 playerIndex); + +protected: + virtual void BeginPlay() override; + + virtual void NotifyActorBeginOverlap(AActor *OtherActor) override; + + UPROPERTY(Replicated) + float Damage; + + UPROPERTY(Replicated) + int8 PlayerIndex = -1; + + // UPROPERTY(EditAnywhere, Replicated) + // USphereComponent *CollisionComponent; + + UPROPERTY(EditAnywhere, Replicated) + UParticleSystemComponent *ParticleSystemComponent; +}; diff --git a/Source/TurnBasedTutorial/MyGameState.cpp b/Source/TurnBasedTutorial/MyGameState.cpp index c66124d..98f7675 100644 --- a/Source/TurnBasedTutorial/MyGameState.cpp +++ b/Source/TurnBasedTutorial/MyGameState.cpp @@ -18,18 +18,13 @@ void AMyGameState::AddTrooper_Implementation(ATrooper *Trooper) { Troopers.Add(Trooper); } -void AMyGameState::StartGame_Implementation() const { - PlayerNotInTurn()->SetEnemySelection(Troopers); - PlayerInTurn()->SetEnemySelection(Troopers); +void AMyGameState::StartGame_Implementation() { + PlayerNotInTurn()->SetEnemySelection(); + PlayerInTurn()->SetEnemySelection(); + bGameStarted = true; PlayerInTurn()->StartTurn(); } -// void AMyGameState::StartGame() const { -// PlayerNotInTurn()->SetEnemySelection(Troopers); -// PlayerInTurn()->SetEnemySelection(Troopers); -// PlayerInTurn()->StartTurn(); -// } - void AMyGameState::CycleTurns_Implementation() { PlayerInTurn()->EndTurn(); for (const auto Trooper : Troopers) { @@ -70,9 +65,14 @@ bool AMyGameState::IsInTurn(uint8 PlayerIndex) const { return PlayerIndex == CurrentPlayerTurn; } +bool AMyGameState::IsGameStarted() const { + return bGameStarted; +} + void AMyGameState::GetLifetimeReplicatedProps( TArray &OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(AMyGameState, Troopers); DOREPLIFETIME(AMyGameState, CurrentPlayerTurn); + DOREPLIFETIME(AMyGameState, bGameStarted); } diff --git a/Source/TurnBasedTutorial/MyGameState.h b/Source/TurnBasedTutorial/MyGameState.h index fbbaf1e..858afae 100644 --- a/Source/TurnBasedTutorial/MyGameState.h +++ b/Source/TurnBasedTutorial/MyGameState.h @@ -21,7 +21,7 @@ public: void AddTrooper(ATrooper *Trooper); UFUNCTION(Server, Reliable) - void StartGame() const; + void StartGame(); UFUNCTION(BlueprintCallable, Server, Reliable) void CycleTurns(); @@ -38,10 +38,16 @@ public: UFUNCTION() bool IsInTurn(uint8 PlayerIndex) const; + UFUNCTION() + bool IsGameStarted() const; + private: UPROPERTY(Replicated) TArray Troopers; + UPROPERTY(Replicated) + bool bGameStarted = false; + UPROPERTY(Replicated) uint8 CurrentPlayerTurn{0}; diff --git a/Source/TurnBasedTutorial/MyPawn.cpp b/Source/TurnBasedTutorial/MyPawn.cpp index 0895d91..22cccff 100644 --- a/Source/TurnBasedTutorial/MyPawn.cpp +++ b/Source/TurnBasedTutorial/MyPawn.cpp @@ -15,6 +15,20 @@ void AMyPawn::BeginPlay() { Super::BeginPlay(); } +void AMyPawn::MoveForward(float Val) { + if (Val != 0.f) + { + if (Controller) + { + FRotator ControlSpaceRot = Controller->GetControlRotation(); + ControlSpaceRot.Pitch = 0; + + // transform to world space and add it + AddMovementInput( FRotationMatrix(ControlSpaceRot).GetScaledAxis( EAxis::X ), Val ); + } + } +} + // Called every frame void AMyPawn::Tick(float DeltaTime) { Super::Tick(DeltaTime); diff --git a/Source/TurnBasedTutorial/MyPawn.h b/Source/TurnBasedTutorial/MyPawn.h index 04a4157..ad9b445 100644 --- a/Source/TurnBasedTutorial/MyPawn.h +++ b/Source/TurnBasedTutorial/MyPawn.h @@ -19,6 +19,8 @@ protected: // Called when the game starts or when spawned virtual void BeginPlay() override; + virtual void MoveForward(float Val) override; + public: // Called every frame virtual void Tick(float DeltaTime) override; diff --git a/Source/TurnBasedTutorial/MyPlayerState.cpp b/Source/TurnBasedTutorial/MyPlayerState.cpp index 5b8bfd7..179fbff 100644 --- a/Source/TurnBasedTutorial/MyPlayerState.cpp +++ b/Source/TurnBasedTutorial/MyPlayerState.cpp @@ -4,10 +4,12 @@ #include "MyPlayerState.h" #include "MyGameState.h" +#include "Kismet/GameplayStatics.h" #include "Net/UnrealNetwork.h" AMyPlayerState::AMyPlayerState() : Super(), bIsMyTurn(false), SelectedTrooper(nullptr) { + // PrimaryActorTick.bCanEverTick = true; } void AMyPlayerState::BeginPlay() { @@ -18,15 +20,35 @@ auto AMyPlayerState::GetMyGameState() const { return Cast(GetWorld()->GetGameState()); } +// void AMyPlayerState::Tick(float DeltaSeconds) { +// Super::Tick(DeltaSeconds); +// if (GetMyGameState() && GetMyGameState()->IsGameStarted()) { +// // for (const auto Actor : Troopers) { +// // const auto Trooper = Cast(Actor); +// // if (Trooper != nullptr && Trooper->GetPlayerIndex() != +// // PlayerIndex) { +// // Trooper->HighlightAsEnemy(PlayerIndex); +// // } +// // } +// bIsSelectionInitialized = true; +// SetActorTickEnabled(false); +// } +// } + void AMyPlayerState::SetPlayerIndex(uint8 NewPlayerIndex) { PlayerIndex = NewPlayerIndex; } void AMyPlayerState::SetEnemySelection_Implementation( - const TArray &Troopers) const { - for (const auto Trooper : Troopers) { - if (Trooper != nullptr && Trooper->GetPlayerIndex() != PlayerIndex) { - Trooper->HighlightAsEnemy(); + /*const TArray &Troopers*/) const { + TArray Troopers; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), + ATrooper::StaticClass(), + Troopers); + for (const auto Actor : Troopers) { + const auto Trooper = Cast(Actor); + if (Trooper != nullptr) { + Trooper->HighlightAsEnemy(PlayerIndex); } } } @@ -60,7 +82,8 @@ void AMyPlayerState::MoveTrooper_Implementation(ATrooper *Trooper, void AMyPlayerState::Attack_Implementation(ATrooper *Attacker, FVector Location, int ActionIndex, - const TArray &Troopers) { + const TArray & + Troopers) { if (Attacker->CheckAttackCorrectness(Location, ActionIndex)) { Attacker->Attack(ActionIndex, Location); // for (const auto Trooper : Troopers) { @@ -96,7 +119,6 @@ void AMyPlayerState::SetMyTurn(bool bMyTurn) { } } - void AMyPlayerState::StartTurn_Implementation() { SetMyTurn(true); UE_LOG(LogTemp, Warning, TEXT("Your turn, %d"), PlayerIndex); @@ -104,7 +126,8 @@ void AMyPlayerState::StartTurn_Implementation() { void AMyPlayerState::EndTurn_Implementation() { if (bIsMyTurn) { - UE_LOG(LogTemp, Warning, TEXT("End Turn from player %d"), PlayerIndex); + UE_LOG(LogTemp, Warning, TEXT("End Turn from player %d"), + PlayerIndex); SetMyTurn(false); if (SelectedTrooper) { SelectedTrooper->SetSelection(false, CurrentAction); @@ -117,7 +140,6 @@ void AMyPlayerState::EndTurn_Implementation() { } } - void AMyPlayerState::OnPlayerAction(const FHitResult &HitResult) { auto const NewlySelectedLocation = HitResult.Location; ATrooper *NewlySelectedTrooper = Cast( @@ -132,7 +154,8 @@ void AMyPlayerState::OnPlayerAction(const FHitResult &HitResult) { if (NewlySelectedTrooper == nullptr || !NewlySelectedTrooper-> IsValidLowLevel() || NewlySelectedTrooper->GetPlayerIndex() != PlayerIndex) { - if (SelectedTrooper != nullptr && SelectedTrooper->IsValidLowLevel()) { + if (SelectedTrooper != nullptr && SelectedTrooper-> + IsValidLowLevel()) { switch (CurrentAction) { case 0: UE_LOG(LogTemp, Warning, TEXT("Do move")); @@ -153,7 +176,8 @@ void AMyPlayerState::OnPlayerAction(const FHitResult &HitResult) { } } } else if (NewlySelectedTrooper != nullptr && NewlySelectedTrooper-> - IsValidLowLevel() && NewlySelectedTrooper->GetPlayerIndex() == + IsValidLowLevel() && NewlySelectedTrooper->GetPlayerIndex() + == PlayerIndex) { UE_LOG(LogTemp, Warning, TEXT("Do reselect")); // our move, selection @@ -170,11 +194,11 @@ void AMyPlayerState::SetCurrentAction_Implementation(int Action) { if (SelectedTrooper) { SelectedTrooper->UpdateSelectionRadius(Action); } - UE_LOG(LogTemp, Warning, TEXT("SetCurrentAction: %d on Player Controller " + UE_LOG(LogTemp, Warning, + TEXT("SetCurrentAction: %d on Player Controller " "with index %d"), CurrentAction, PlayerIndex); } - uint8 AMyPlayerState::GetPlayerIndex() const { return PlayerIndex; } @@ -186,4 +210,5 @@ void AMyPlayerState::GetLifetimeReplicatedProps( DOREPLIFETIME(AMyPlayerState, CurrentAction); DOREPLIFETIME(AMyPlayerState, bIsMyTurn); DOREPLIFETIME(AMyPlayerState, SelectedTrooper); + DOREPLIFETIME(AMyPlayerState, bIsSelectionInitialized); } diff --git a/Source/TurnBasedTutorial/MyPlayerState.h b/Source/TurnBasedTutorial/MyPlayerState.h index b650430..a3beef1 100644 --- a/Source/TurnBasedTutorial/MyPlayerState.h +++ b/Source/TurnBasedTutorial/MyPlayerState.h @@ -19,6 +19,8 @@ public: virtual void BeginPlay() override; + // virtual void Tick(float DeltaSeconds) override; + UFUNCTION(Client, Reliable) void StartTurn(); @@ -53,10 +55,11 @@ public: void SetPlayerIndex(uint8 NewPlayerIndex); UFUNCTION(Client, Reliable) - void SetEnemySelection(const TArray &Troopers) const; - + void SetEnemySelection(/*const TArray &Troopers*/) const; private: + UPROPERTY(Replicated) + bool bIsSelectionInitialized = false; UPROPERTY(Replicated) uint8 PlayerIndex; diff --git a/Source/TurnBasedTutorial/MyProjectile.cpp b/Source/TurnBasedTutorial/MyProjectile.cpp index d73cedb..301ea77 100644 --- a/Source/TurnBasedTutorial/MyProjectile.cpp +++ b/Source/TurnBasedTutorial/MyProjectile.cpp @@ -47,6 +47,7 @@ void AMyProjectile::Initialize(const UAbility *Ability, ProjectileMovementComponent->InitialSpeed = ProjectileMovementComponent->MaxSpeed = Ability->Speed; Damage = Ability->Damage; + SplashRadius = Ability->SplashRadius; float Scale = Ability->LinearWidth / 100; // CollisionComponent->SetSphereRadius(Ability->LinearWidth / 2); ProjectileMeshComponent->SetWorldScale3D({Scale, Scale, Scale}); @@ -77,38 +78,55 @@ void AMyProjectile::NotifyActorBeginOverlap(AActor *OtherActor) { } } -void AMyProjectile::NotifyHit(UPrimitiveComponent *MyComp, - AActor *Other, - UPrimitiveComponent *OtherComp, - bool bSelfMoved, - FVector HitLocation, - FVector HitNormal, - FVector NormalImpulse, - const FHitResult &Hit) { - Super::NotifyHit(MyComp, Other, OtherComp, bSelfMoved, HitLocation, - HitNormal, - NormalImpulse, Hit); - ATrooper *OtherTrooper = Cast(Other); - if (OtherTrooper) { - UE_LOG(LogTemp, Warning, - TEXT("On Hit: id: %d, index: %d, damage: %f, my index: %d" - ), - OtherTrooper->GetId(), OtherTrooper->GetPlayerIndex(), Damage, - PlayerIndex); - if (PlayerIndex != -1 && PlayerIndex != OtherTrooper-> - GetPlayerIndex()) { - OtherTrooper->TakeDamage(Damage); - } - } else { - UE_LOG(LogTemp, Warning, TEXT("Overlapped not a trooper")); - } -} +// void AMyProjectile::NotifyHit(UPrimitiveComponent *MyComp, +// AActor *Other, +// UPrimitiveComponent *OtherComp, +// bool bSelfMoved, +// FVector HitLocation, +// FVector HitNormal, +// FVector NormalImpulse, +// const FHitResult &Hit) { +// Super::NotifyHit(MyComp, Other, OtherComp, bSelfMoved, HitLocation, +// HitNormal, +// NormalImpulse, Hit); +// ATrooper *OtherTrooper = Cast(Other); +// if (OtherTrooper) { +// UE_LOG(LogTemp, Warning, +// TEXT("On Hit: id: %d, index: %d, damage: %f, my index: %d" +// ), +// OtherTrooper->GetId(), OtherTrooper->GetPlayerIndex(), Damage, +// PlayerIndex); +// if (PlayerIndex != -1 && PlayerIndex != OtherTrooper-> +// GetPlayerIndex()) { +// OtherTrooper->TakeDamage(Damage); +// } +// } else { +// UE_LOG(LogTemp, Warning, TEXT("Overlapped not a trooper")); +// } +// } void AMyProjectile::BeginPlay() { Super::BeginPlay(); } +void AMyProjectile::EndPlay(const EEndPlayReason::Type EndPlayReason) { + Super::EndPlay(EndPlayReason); + Explode(); +} + +void AMyProjectile::Explode_Implementation() const { + const FTransform SpawnTransform = GetTransform(); + FActorSpawnParameters SpawnParameters; + SpawnParameters.Instigator = GetInstigator(); + SpawnParameters.SpawnCollisionHandlingOverride = + ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + AMyExplosion *Explosion = GetWorld()->SpawnActor( + ExplosionSubclass, SpawnTransform, SpawnParameters); + Explosion->Initialize(Damage, SplashRadius, PlayerIndex); + Explosion->SetActorLocation(GetActorLocation()); +} + void AMyProjectile::GetLifetimeReplicatedProps( TArray &OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); @@ -117,4 +135,5 @@ void AMyProjectile::GetLifetimeReplicatedProps( // DOREPLIFETIME(AMyProjectile, CollisionComponent); DOREPLIFETIME(AMyProjectile, ProjectileMeshComponent); DOREPLIFETIME(AMyProjectile, ProjectileMovementComponent); + DOREPLIFETIME(AMyProjectile, SplashRadius); } diff --git a/Source/TurnBasedTutorial/MyProjectile.h b/Source/TurnBasedTutorial/MyProjectile.h index 612001c..bfcc820 100644 --- a/Source/TurnBasedTutorial/MyProjectile.h +++ b/Source/TurnBasedTutorial/MyProjectile.h @@ -4,6 +4,7 @@ #include "CoreMinimal.h" #include "Ability.h" +#include "MyExplosion.h" #include "Components/SphereComponent.h" #include "GameFramework/Actor.h" #include "GameFramework/ProjectileMovementComponent.h" @@ -24,15 +25,18 @@ public: protected: virtual void NotifyActorBeginOverlap(AActor *OtherActor) override; + + UPROPERTY(EditAnywhere, BlueprintReadWrite) + TSubclassOf ExplosionSubclass; - virtual void NotifyHit(UPrimitiveComponent *MyComp, - AActor *Other, - UPrimitiveComponent *OtherComp, - bool bSelfMoved, - FVector HitLocation, - FVector HitNormal, - FVector NormalImpulse, - const FHitResult &Hit) override; + // virtual void NotifyHit(UPrimitiveComponent *MyComp, + // AActor *Other, + // UPrimitiveComponent *OtherComp, + // bool bSelfMoved, + // FVector HitLocation, + // FVector HitNormal, + // FVector NormalImpulse, + // const FHitResult &Hit) override; UPROPERTY(Replicated) float Damage; @@ -40,6 +44,9 @@ protected: UPROPERTY(Replicated) int8 PlayerIndex = -1; + UPROPERTY(Replicated) + float SplashRadius; + // UPROPERTY(EditAnywhere, Replicated) // USphereComponent *CollisionComponent; @@ -50,4 +57,9 @@ protected: UProjectileMovementComponent *ProjectileMovementComponent; virtual void BeginPlay() override; + + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + UFUNCTION(Server, Reliable) + void Explode() const; }; diff --git a/Source/TurnBasedTutorial/Trooper.cpp b/Source/TurnBasedTutorial/Trooper.cpp index 8e4d985..edc00fe 100644 --- a/Source/TurnBasedTutorial/Trooper.cpp +++ b/Source/TurnBasedTutorial/Trooper.cpp @@ -113,20 +113,20 @@ void ATrooper::Tick(float const DeltaTime) { } } -void ATrooper::OnRepNotify_PlayerIndex() const { - const AMyPlayerState *player = Cast( - GetPlayerState()); - if (!player) - return; - const uint8 ClientIndex = player->GetPlayerIndex(); - UE_LOG(LogTemp, Warning, - TEXT("On rep notify, index: %d, client index: %d, id: %d"), - PlayerIndex, - ClientIndex, Id); - if (ClientIndex == PlayerIndex) { - HighlightAsEnemy(); - } -} +// void ATrooper::OnRepNotify_PlayerIndex() const { +// const AMyPlayerState *player = Cast( +// GetPlayerState()); +// if (!player) +// return; +// const uint8 ClientIndex = player->GetPlayerIndex(); +// UE_LOG(LogTemp, Warning, +// TEXT("On rep notify, index: %d, client index: %d, id: %d"), +// PlayerIndex, +// ClientIndex, Id); +// if (ClientIndex == PlayerIndex) { +// HighlightAsEnemy(); +// } +// } void ATrooper::MoveTrooper(FVector const NewPos) { TargetLocation = NewPos; @@ -225,8 +225,10 @@ void ATrooper::UpdateSelectionRadius(uint8 ActionType) const { {radiusScale, radiusScale, 0.01f}); } -void ATrooper::HighlightAsEnemy_Implementation() const { - SelectionStaticMesh->SetVisibility(true); +void ATrooper::HighlightAsEnemy_Implementation(int8 Index) const { + if (PlayerIndex != Index) { + SelectionStaticMesh->SetVisibility(true); + } } void ATrooper::ResetActionPoints() { diff --git a/Source/TurnBasedTutorial/Trooper.h b/Source/TurnBasedTutorial/Trooper.h index 6866ae4..c48dabf 100644 --- a/Source/TurnBasedTutorial/Trooper.h +++ b/Source/TurnBasedTutorial/Trooper.h @@ -57,8 +57,8 @@ public: void UpdateSelectionRadius(uint8 ActionType) const; UFUNCTION(Client, Reliable) - void HighlightAsEnemy() const; - + void HighlightAsEnemy(int8 Index) const; + UFUNCTION() void ResetActionPoints(); @@ -160,11 +160,11 @@ protected: // const TCHAR *MeshPath = nullptr; - UFUNCTION() - void OnRepNotify_PlayerIndex() const; + // UFUNCTION() + // void OnRepNotify_PlayerIndex() const; - UPROPERTY(ReplicatedUsing = OnRepNotify_PlayerIndex) - uint8 PlayerIndex = -1; + UPROPERTY(Replicated/*Using = OnRepNotify_PlayerIndex*/) + int8 PlayerIndex = -1; UPROPERTY(Replicated) uint8 Id;