protected virtual void FireRPC_ProjectileWeapon(Vector3 targetPoint, string serializedDamageDetails)
    {
        WeaponDamageDetails weaponDamageDetails = JsonUtility.FromJson <WeaponDamageDetails>(serializedDamageDetails);

        //   parentRigidbody = transform.root.GetComponent<Rigidbody>();
        // debug function to fire weapon
        weaponAnimator.SetTrigger(primaryFireAnimatorTriggerName);
        //  Debug.Log("ProjectileWeapon class object has fired");

        // if we are the owner of the photonview, then fire the real projectile


        /*
         * PooledObject pooledProjectile =
         *  Pool.Instance.Spawn(projectilePrefab, barrelTransform.position, barrelTransform.rotation);
         *
         *
         * GameObject projectile = pooledProjectile.gameObject;
         */

        GameObject obj = projectilePrefab;
        //  StopProjectileCollisionsWithSelf(obj);
        GameObject projectile = Instantiate(obj, barrelEndMuzzleTransform.position, barrelEndMuzzleTransform.rotation);
        // StopProjectileCollisionsWithSelf(projectile);

        ProjectileScript projScript = projectile.GetComponent <ProjectileScript>();

        // set projscript stuff
        projScript.SetWeaponDamageDetails(weaponDamageDetails);
        projScript.ActivateProjectile(imapactParticle, missImpactParticle, projectileParticleEffectPrefab, impactParticleSound, impactParticleSoundMiss, imapactParticleVolume, missImpactParticleVolume);


        DoMuzzleFlashEffect();
        projectile.transform.LookAt(targetPoint);

        PlayAudioClipOneShot(weaponFireSound);
        projectile.GetComponent <PhysXRigidBody>().mass = projectileMass;
        // FIRE REAL PROJECTILE
        if (gunnerPhotonView.IsMine)
        {
            projScript.SetTrueProjectile(true);
            projectile.GetComponent <PhysXRigidBody>().AddForce(projectileSpeed * (projectile.transform.forward), ForceMode.VelocityChange);
            if (inheritVelocityFromVehicle)
            {
                projectile.GetComponent <PhysXRigidBody>().AddForce(parentRigidbody.velocity, ForceMode.VelocityChange);
            }
        }
        // add projectile settings
        // otherwise fire a lag compensated dummy projectile with no damage scripts enabled
        else
        {
            projScript.SetTrueProjectile(false);
            float ping = (PhotonNetwork.GetPing() * 1.0f) / 2;
            // update position by ping
            Vector3 newPos = projectile.transform.position + (projectile.transform.forward * (ping * 0.001f) * projectileSpeed);
            if (inheritVelocityFromVehicle)
            {
                newPos += parentRigidbody.velocity * ping * 0.001f;
            }

            projectile.transform.position = newPos;
            projectile.GetComponent <PhysXRigidBody>().AddForce(projectileSpeed * (projectile.transform.forward), ForceMode.VelocityChange);
        }

        Destroy(projectile, 4f);
        //pooledProjectile.Finish(4f);
    }