SERVER RPC sometimes doesn't execute

Hi, I’ve been stuck on this problem for a while now and have no idea how to fix it. I have a weapon class that has a fire function that shoots a line trace and applies point damage. I’ve heard that the damage system is server-side only, so I call a server RPC to replicate the fire function to my clients. This works sometimes. In some sessions, this works perfectly and both server and client can damage each other, however, sometimes the RPC does not fire and the client cannot damage the player. I have debugged this problem and found that it is the RPC that sometimes refuses to execute. Below is the weapon code. Any help is appreciated, thanks.

AC_BaseGun::AC_BaseGun()
{
	BaseDamage = 15.0f;

	// Rounds per minute
	RateOfFire = 600.0f;

	NetUpdateFrequency = 30.0f;
	MinNetUpdateFrequency = 10.0f;
}

void AC_BaseGun::BeginPlay()
{
	Super::BeginPlay();

	// Divide by 60 to get per minute
	TimeBetweenShots = 60.0f / RateOfFire;
}

// Overriden from base class
void AC_BaseGun::Attack()
{
	StartFire();
}

void AC_BaseGun::StopAttack()
{
	//	Super::Attack();
	StopFire();
}

void AC_BaseGun::Fire()
{
	AActor* MyOwner = GetOwner();

	if(!(MyOwner->HasAuthority()))
	{
		Server_Fire();
		UE_LOG(LogTemp, Log, TEXT("CLIENT CALLED SERVER_FIRE()"));

		//return;
	}

	if(MyOwner)
	{
		UE_LOG(LogTemp, Log, TEXT("SERVER FIRED"));

		FVector EyeLocation;
		FRotator EyeRotation;
		MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotation);

		FVector ShotDirection = EyeRotation.Vector();
		FVector TraceEnd = EyeLocation + (ShotDirection * 5000);

		FCollisionQueryParams QueryParams;

		QueryParams.AddIgnoredActor(MyOwner);
		QueryParams.AddIgnoredActor(this);
		QueryParams.bTraceComplex = true;
		QueryParams.bReturnPhysicalMaterial = true;

		FHitResult Hit;

		bool bHit = GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, COLLISION_WEAPON, QueryParams);

		if(bHit)
		{
			AActor* HitActor = Hit.GetActor();

			EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());

			// Head shot damage should only be applied when shields = 0

			float ActualDamage = BaseDamage;
			if (SurfaceType == SURFACE_FLESHVULNERABLE)
			{
				ActualDamage *= 3.0f;
			}

			UGameplayStatics::ApplyPointDamage(HitActor, ActualDamage, ShotDirection, Hit, MyOwner->GetInstigatorController(), this, DamageType);

			DrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1.0f, 0, 1.0f);

			UParticleSystem* SelectedEffect = nullptr;
			switch (SurfaceType)
			{
			case SURFACE_FLESHDEFAULT:
			case SURFACE_FLESHVULNERABLE:
				SelectedEffect = FleshImpactEffect;
				break;

			default:
				SelectedEffect = DefaultImpactEffect;
				break;
			}

			UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());
		}

		PlayFireEffects();

		LastFireTime = GetWorld()->TimeSeconds;
	}
}

void AC_BaseGun::PlayFireEffects()
{
	UGameplayStatics::SpawnEmitterAttached(MuzzleEffect, WeaponMesh, MuzzleSocketName);

	APawn* MyOwner = Cast<APawn>(GetOwner());

	if(MyOwner)
	{
		APlayerController* PC = Cast<APlayerController>(MyOwner->GetController());
		if(PC)
		{
			PC->ClientPlayCameraShake(FireShake);
		}
	}
}


void AC_BaseGun::StartFire()
{
	// This ensures that a player cannot fire shots faster than fire rate by just rapidly clicking. 
	// Clamp this so if First delay is -ve use 0 -- Max uses largest value
	
	float FirstDelay = FMath::Max(LastFireTime + TimeBetweenShots - GetWorld()->TimeSeconds, 0.0f);

	GetWorldTimerManager().SetTimer(AutomaticFireHandle, this, &AC_BaseGun::Fire, TimeBetweenShots, true, FirstDelay);
}

void AC_BaseGun::StopFire()
{
	GetWorldTimerManager().ClearTimer(AutomaticFireHandle);
}

void AC_BaseGun::Server_Fire_Implementation()
{
	UE_LOG(LogTemp, Log, TEXT("CLIENT EXECUTED SERVER_FIRE"));
	Fire();
}