diff --git a/Content/Blueprints/Character/Ball/BP_Ball.uasset b/Content/Blueprints/Character/Ball/BP_Ball.uasset index 1883de0b5..bb224cdf5 100644 Binary files a/Content/Blueprints/Character/Ball/BP_Ball.uasset and b/Content/Blueprints/Character/Ball/BP_Ball.uasset differ diff --git a/Content/Maps/warmup.umap b/Content/Maps/warmup.umap index 2d4b11bfc..6eeefa1b1 100644 Binary files a/Content/Maps/warmup.umap and b/Content/Maps/warmup.umap differ diff --git a/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.cpp b/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.cpp index d6bfb9860..aa9eb21b8 100644 --- a/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.cpp +++ b/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.cpp @@ -89,6 +89,24 @@ void UCloud9CharacterHealthComponent::OnRegister() MyOwner->OnTakeRadialDamage.AddUniqueDynamic(this, &UCloud9CharacterHealthComponent::OnTakeRadialDamage); } +void UCloud9CharacterHealthComponent::CheckIfDeath(const AActor* DamagedActor, const AController* InstigatedBy) +{ + if (DamagedActor->IsPendingKill()) + { + if (not IsValid(InstigatedBy)) + { + log(Error, "[Component = %s] InstigatedBy is invalid", *GetName()); + return; + } + + // TODO: Make score component + if (let Character = Cast(InstigatedBy->GetCharacter()); IsValid(Character)) + { + Character->AddScore(); + } + } +} + bool UCloud9CharacterHealthComponent::ChangeHasHelmet(bool NewState) { if (bHasHelmet != NewState) @@ -114,15 +132,7 @@ void UCloud9CharacterHealthComponent::OnTakePointDamage( { TakeHealthDamage(Damage); // TODO: Add factor by armor TakeArmorDamage(0.0f); // TODO: Add armor damage calc - - if (DamagedActor->IsPendingKill()) - { - // TODO: Make score component - if (let Character = Cast(DamageCauser->GetOwner()); IsValid(Character)) - { - Character->AddScore(); - } - } + CheckIfDeath(DamagedActor, InstigatedBy); } void UCloud9CharacterHealthComponent::OnTakeRadialDamage( @@ -136,4 +146,5 @@ void UCloud9CharacterHealthComponent::OnTakeRadialDamage( { TakeHealthDamage(Damage); // TODO: Add factor by armor TakeArmorDamage(0.0f); // TODO: Add armor damage calc + CheckIfDeath(DamagedActor, InstigatedBy); } diff --git a/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.h b/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.h index 207f58793..0ed82bbce 100644 --- a/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.h +++ b/Source/Cloud9/Character/Components/Cloud9CharacterHealthComponent.h @@ -90,6 +90,8 @@ class CLOUD9_API UCloud9CharacterHealthComponent virtual void OnRegister() override; + void CheckIfDeath(const AActor* DamagedActor, const AController* InstigatedBy); + protected: UPROPERTY(BlueprintAssignable, meta=(AllowPrivateAccess), Category=Events) FOnHealthChange OnHealthChange; diff --git a/Source/Cloud9/Character/Components/Cloud9Inventory.cpp b/Source/Cloud9/Character/Components/Cloud9Inventory.cpp index c2d92a8be..3cb61bba7 100644 --- a/Source/Cloud9/Character/Components/Cloud9Inventory.cpp +++ b/Source/Cloud9/Character/Components/Cloud9Inventory.cpp @@ -69,7 +69,7 @@ bool UCloud9Inventory::SelectWeaponImpl(EWeaponSlot Slot, bool Instant, bool For return false; } - if (Slot == SelectedWeaponSlot) + if (not Force and Slot == SelectedWeaponSlot) { log(Warning, "[Inventory='%s'] No switching will be performed", *GetName()); return false; diff --git a/Source/Cloud9/Weapon/Classes/Cloud9WeaponBase.cpp b/Source/Cloud9/Weapon/Classes/Cloud9WeaponBase.cpp index 60ad460a0..c52ef6648 100644 --- a/Source/Cloud9/Weapon/Classes/Cloud9WeaponBase.cpp +++ b/Source/Cloud9/Weapon/Classes/Cloud9WeaponBase.cpp @@ -394,6 +394,11 @@ bool ACloud9WeaponBase::AddToInventory(ACloud9Character* Character, EWeaponSlot SetOwner(Character); + // Set new instigator for this weapon so When weapon thrown owner will be changed + // to nothing but we need to know who do it (throw a weapon) + // This is important for nades to get handle number of kills for player + SetInstigator(Character); + if (not UpdateWeaponAttachment(NewSlot, EWeaponBond::Holstered)) { log(Error, "Failed to update attachment for weapon '%s' slot '%s'", *GetName(), SLOT_NAME); @@ -434,12 +439,6 @@ bool ACloud9WeaponBase::ChangeState(EWeaponBond NewBond, bool Instant, bool Forc return false; } - if (WeaponState.IsWeaponBond(NewBond)) - { - log(Error, "[Weapon='%s' Bond='%s'] Weapon will remain the same", *GetName(), BOND_NAME); - return false; - } - if (not Force and IsAnyMontagePlaying()) { log(Verbose, "[Weapon='%s' Bond='%s'] Montage is playing now", *GetName(), BOND_NAME); diff --git a/Source/Cloud9/Weapon/Classes/Cloud9WeaponGrenade.cpp b/Source/Cloud9/Weapon/Classes/Cloud9WeaponGrenade.cpp index c084ffe90..a4e65858b 100644 --- a/Source/Cloud9/Weapon/Classes/Cloud9WeaponGrenade.cpp +++ b/Source/Cloud9/Weapon/Classes/Cloud9WeaponGrenade.cpp @@ -165,8 +165,6 @@ void ACloud9WeaponGrenade::Tick(float DeltaSeconds) } else if (WeaponState.IsActionActive(EWeaponAction::PrimaryStart)) { - log(Display, "EWeaponAction::Primary"); - ExecuteAction( EWeaponAction::PrimaryStart, GetWeaponInfo()->PinpullTime, @@ -180,8 +178,6 @@ void ACloud9WeaponGrenade::Tick(float DeltaSeconds) } else if (WeaponState.IsActionActive(EWeaponAction::PrimaryLoop)) { - log(Display, "EWeaponAction::PrimaryLoop"); - // Play hold frame of montage PlayAnimMontage( PoseMontages->PinpullPrimaryActionMontage, @@ -202,8 +198,6 @@ void ACloud9WeaponGrenade::Tick(float DeltaSeconds) } else if (WeaponState.IsActionActive(EWeaponAction::PrimaryEnd)) { - log(Display, "EWeaponAction::PrimaryEnd"); - ExecuteAction( EWeaponAction::PrimaryEnd, GetWeaponInfo()->ThrowTime, @@ -225,7 +219,6 @@ bool ACloud9WeaponGrenade::OnGrenadeActionFinished() { if (IsValid(this)) { - log(Display, "OnGrenadeActionFinished()") Destroy(); SetActorTickEnabled(false); return true; @@ -269,6 +262,8 @@ bool ACloud9WeaponGrenade::OnGrenadeActionLoop() let IgnoredActors = TArray{}; + let InstigatorController = GetInstigatorController(); + // TODO: Handle other types of nades if required UGameplayStatics::ApplyRadialDamage( GetWorld(), @@ -278,7 +273,7 @@ bool ACloud9WeaponGrenade::OnGrenadeActionLoop() UDamageType::StaticClass(), IgnoredActors, this, - nullptr, + InstigatorController, false, ECC_Visibility); Explosion->FireImpulse(); @@ -356,8 +351,6 @@ bool ACloud9WeaponGrenade::OnGrenadeThrown() return false; } - log(Display, "OnGrenadeThrown()") - DetonationTimerHandle = GetWorld() | EUWorld::AsyncAfter{ [this] { WeaponState.GrenadeActionLoop(); }, @@ -419,6 +412,8 @@ bool ACloud9WeaponGrenade::Throw() const if (IsInfiniteAmmo) { Inventory->AddWeapon(GrenadeConfig); + // need to force select for valid grenade state + Inventory->SelectWeapon(GrenadeConfig.GetWeaponSlot(), true, true); } return true;