diff --git a/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset b/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset index 3a0876d..c5b8a23 100644 Binary files a/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset and b/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset differ diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 3bc6f9b..1f43fd2 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -114,6 +114,10 @@ void ABlasterCharacter::PlayEliminatedMontage() void ABlasterCharacter::Eliminated() { + if (Combat && Combat->EquippedWeapon) + { + Combat->EquippedWeapon->Dropped(); + } MulticastEliminated(); GetWorldTimerManager().SetTimer(EliminationTimer, this, &ABlasterCharacter::EliminationTimerFinished, EliminationDelay); } @@ -123,6 +127,7 @@ void ABlasterCharacter::MulticastEliminated_Implementation() bEliminated = true; PlayEliminatedMontage(); + // Start dissolve effect if (DissolveMaterialInstance) { DynamicDissolveMaterialInstance = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this); @@ -131,6 +136,18 @@ void ABlasterCharacter::MulticastEliminated_Implementation() DynamicDissolveMaterialInstance->SetScalarParameterValue(TEXT("Glow"), 200.f); } StartDissolve(); + + // Disable character movement + GetCharacterMovement()->DisableMovement(); + GetCharacterMovement()->StopMovementImmediately(); + if (BlasterPlayerController) + { + DisableInput(BlasterPlayerController); + } + + // Disable collision + GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision); + GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision); } void ABlasterCharacter::EliminationTimerFinished() diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index 729a38f..9780d79 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -164,15 +164,6 @@ void UCombatComponent::ServerSetAiming_Implementation(bool bIsAiming) } } -void UCombatComponent::OnRep_EquippedWeapon() -{ - if (EquippedWeapon && Character) - { - Character->GetCharacterMovement()->bOrientRotationToMovement = false; - Character->bUseControllerRotationYaw = true; - } -} - void UCombatComponent::Fire() { if (bCanFire) @@ -295,3 +286,18 @@ void UCombatComponent::EquipWeapon(AWeapon* WeaponToEquip) Character->GetCharacterMovement()->bOrientRotationToMovement = false; Character->bUseControllerRotationYaw = true; } + +void UCombatComponent::OnRep_EquippedWeapon() +{ + if (EquippedWeapon && Character) + { + EquippedWeapon->SetWeaponState(EWeaponState::EWS_Equipped); + const USkeletalMeshSocket* HandSocket = Character->GetMesh()->GetSocketByName(FName("RightHandSocket")); + if (HandSocket) + { + HandSocket->AttachActor(EquippedWeapon, Character->GetMesh()); + } + Character->GetCharacterMovement()->bOrientRotationToMovement = false; + Character->bUseControllerRotationYaw = true; + } +} \ No newline at end of file diff --git a/Source/Blaster/Weapon/Weapon.cpp b/Source/Blaster/Weapon/Weapon.cpp index 7c493d6..c88eee4 100644 --- a/Source/Blaster/Weapon/Weapon.cpp +++ b/Source/Blaster/Weapon/Weapon.cpp @@ -89,6 +89,18 @@ void AWeapon::SetWeaponState(EWeaponState State) case EWeaponState::EWS_Equipped: ShowPickupWidget(false); GetAreaSphere()->SetCollisionEnabled(ECollisionEnabled::NoCollision); + WeaponMesh->SetSimulatePhysics(false); + WeaponMesh->SetEnableGravity(false); + WeaponMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + break; + case EWeaponState::EWS_Dropped: + if (HasAuthority()) + { + GetAreaSphere()->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + } + WeaponMesh->SetSimulatePhysics(true); + WeaponMesh->SetEnableGravity(true); + WeaponMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); break; } } @@ -99,6 +111,14 @@ void AWeapon::OnRep_WeaponState() { case EWeaponState::EWS_Equipped: ShowPickupWidget(false); + WeaponMesh->SetSimulatePhysics(false); + WeaponMesh->SetEnableGravity(false); + WeaponMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + break; + case EWeaponState::EWS_Dropped: + WeaponMesh->SetSimulatePhysics(true); + WeaponMesh->SetEnableGravity(true); + WeaponMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); break; } } @@ -136,3 +156,11 @@ void AWeapon::Fire(const FVector& HitTarget) } } } + +void AWeapon::Dropped() +{ + SetWeaponState(EWeaponState::EWS_Dropped); + const FDetachmentTransformRules DetachRules(EDetachmentRule::KeepWorld, true); + WeaponMesh->DetachFromComponent(DetachRules); + SetOwner(nullptr); +} diff --git a/Source/Blaster/Weapon/Weapon.h b/Source/Blaster/Weapon/Weapon.h index 2222918..1bf02e0 100644 --- a/Source/Blaster/Weapon/Weapon.h +++ b/Source/Blaster/Weapon/Weapon.h @@ -26,6 +26,7 @@ public: virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; void ShowPickupWidget(bool bShowWidget); virtual void Fire(const FVector& HitTarget); + void Dropped(); // Textures for the weapon crosshairs