diff --git a/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset b/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset index a13b8d8..f131a2e 100644 Binary files a/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset and b/Content/Blueprints/GameModes/BP_TeamsGameMode.uasset differ diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 2c0b859..ce95569 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -249,7 +249,7 @@ void ABlasterCharacter::MulticastEliminated_Implementation(bool bPlayerLeftGame) void ABlasterCharacter::EliminationTimerFinished() { - ABlasterGameMode* BlasterGameMode = GetWorld()->GetAuthGameMode(); + BlasterGameMode = BlasterGameMode == nullptr ? GetWorld()->GetAuthGameMode() : BlasterGameMode; if (BlasterGameMode && !bLeftGame) { BlasterGameMode->RequestRespawn(this, Controller); @@ -262,7 +262,7 @@ void ABlasterCharacter::EliminationTimerFinished() void ABlasterCharacter::ServerLeaveGame_Implementation() { - ABlasterGameMode* BlasterGameMode = GetWorld()->GetAuthGameMode(); + BlasterGameMode = BlasterGameMode == nullptr ? GetWorld()->GetAuthGameMode() : BlasterGameMode; BlasterPlayerState = BlasterPlayerState == nullptr ? GetPlayerState() : BlasterPlayerState; if (BlasterGameMode && BlasterPlayerState) { @@ -279,7 +279,7 @@ void ABlasterCharacter::Destroyed() EliminationBotComponent->DestroyComponent(); } - ABlasterGameMode* BlasterGameMode = Cast(UGameplayStatics::GetGameMode(this)); + BlasterGameMode = (BlasterGameMode == nullptr) ? GetWorld()->GetAuthGameMode() : BlasterGameMode; bool bMatchNotInProgress = BlasterGameMode && BlasterGameMode->GetMatchState() != MatchState::InProgress; if (Combat && Combat->EquippedWeapon && bMatchNotInProgress) { @@ -538,8 +538,10 @@ void ABlasterCharacter::GrenadeButtonPressed() void ABlasterCharacter::ReceiveDamage(AActor* DamagedActor, float Damage, const UDamageType* DamageType, AController* InstigatorController, AActor* DamageCauser) { - if (bEliminated) return; - + BlasterGameMode = (BlasterGameMode == nullptr) ? GetWorld()->GetAuthGameMode() : BlasterGameMode; + if (bEliminated || BlasterGameMode == nullptr) return; + Damage = BlasterGameMode->CalculateDamage(InstigatorController, Controller, Damage); + float DamageToHealth = Damage; if (Shield > 0.f) { @@ -559,10 +561,7 @@ void ABlasterCharacter::ReceiveDamage(AActor* DamagedActor, float Damage, const UpdateHUDHealth(); UpdateHUDShield(); - if (Health > 0.f) - { - PlayHitReactMontage(); - } + PlayHitReactMontage(); if (Health == 0.f) { @@ -571,7 +570,7 @@ void ABlasterCharacter::ReceiveDamage(AActor* DamagedActor, float Damage, const Eliminated(false); return; } - ABlasterGameMode* BlasterGameMode = GetWorld()->GetAuthGameMode(); + BlasterGameMode = (BlasterGameMode == nullptr) ? GetWorld()->GetAuthGameMode() : BlasterGameMode; if (BlasterGameMode) { BlasterPlayerController = BlasterPlayerController == nullptr ? Cast(Controller) : BlasterPlayerController; @@ -903,7 +902,7 @@ void ABlasterCharacter::UpdateHUDAmmo() void ABlasterCharacter::SpawnDefaultWeapon() { - const ABlasterGameMode* BlasterGameMode = Cast(UGameplayStatics::GetGameMode(this)); + BlasterGameMode = (BlasterGameMode == nullptr) ? GetWorld()->GetAuthGameMode() : BlasterGameMode; UWorld* World = GetWorld(); if (BlasterGameMode && World && !bEliminated && DefaultWeaponClass) { diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index c1d5b4b..52d1e8a 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -322,6 +322,9 @@ private: // Grenade UPROPERTY(VisibleAnywhere) UStaticMeshComponent* AttachedGrenade; + + UPROPERTY() + class ABlasterGameMode* BlasterGameMode; public: void SetOverlappingWeapon(AWeapon* Weapon); diff --git a/Source/Blaster/GameMode/BlasterGameMode.cpp b/Source/Blaster/GameMode/BlasterGameMode.cpp index 3001a4a..95b5228 100644 --- a/Source/Blaster/GameMode/BlasterGameMode.cpp +++ b/Source/Blaster/GameMode/BlasterGameMode.cpp @@ -72,6 +72,12 @@ void ABlasterGameMode::OnMatchStateSet() } } + +float ABlasterGameMode::CalculateDamage(AController* Attacker, AController* Victim, float BaseDamage) +{ + return BaseDamage; +} + void ABlasterGameMode::PlayerEliminated(class ABlasterCharacter* EliminatedCharacter, class ABlasterPlayerController* VictimController, ABlasterPlayerController* AttackerController) { if (AttackerController == nullptr || AttackerController->PlayerState == nullptr) return; diff --git a/Source/Blaster/GameMode/BlasterGameMode.h b/Source/Blaster/GameMode/BlasterGameMode.h index 6ef388f..8693939 100644 --- a/Source/Blaster/GameMode/BlasterGameMode.h +++ b/Source/Blaster/GameMode/BlasterGameMode.h @@ -28,6 +28,7 @@ public: class ABlasterPlayerController* AttackerController); virtual void RequestRespawn(ACharacter* EliminatedCharacter, AController* EliminatedController); void PlayerLeftGame(ABlasterPlayerState* PlayerLeaving); + virtual float CalculateDamage(AController* Attacker, AController* Victim, float BaseDamage); UPROPERTY(EditDefaultsOnly) float WarmupTime = 10.f; diff --git a/Source/Blaster/GameMode/TeamsGameMode.cpp b/Source/Blaster/GameMode/TeamsGameMode.cpp index 95151bf..9772105 100644 --- a/Source/Blaster/GameMode/TeamsGameMode.cpp +++ b/Source/Blaster/GameMode/TeamsGameMode.cpp @@ -65,3 +65,15 @@ void ATeamsGameMode::AssignToTeam(APlayerState* PlayerState) } } } + +float ATeamsGameMode::CalculateDamage(AController* Attacker, AController* Victim, float BaseDamage) +{ + ABlasterPlayerState* AttackerPState = Attacker->GetPlayerState(); + ABlasterPlayerState* VictimPState = Victim->GetPlayerState(); + + if (AttackerPState == nullptr || VictimPState == nullptr) return BaseDamage; + if (VictimPState == AttackerPState) return BaseDamage; + if (AttackerPState->GetTeam() == VictimPState->GetTeam() && !FriendlyFire) return 0.f; + + return BaseDamage; +} diff --git a/Source/Blaster/GameMode/TeamsGameMode.h b/Source/Blaster/GameMode/TeamsGameMode.h index 633ffb1..09906ad 100644 --- a/Source/Blaster/GameMode/TeamsGameMode.h +++ b/Source/Blaster/GameMode/TeamsGameMode.h @@ -17,13 +17,17 @@ class BLASTER_API ATeamsGameMode : public ABlasterGameMode public: virtual void PostLogin(APlayerController* NewPlayer) override; virtual void Logout(AController* Exiting) override; - + virtual float CalculateDamage(AController* Attacker, AController* Victim, float BaseDamage) override; + protected: virtual void HandleMatchHasStarted() override; private: UPROPERTY() class ABlasterGameState* BGameState; + + UPROPERTY(EditAnywhere) + bool FriendlyFire = false; void AssignToTeam(APlayerState* PlayerState);