OnProjectileRicochet hook (Rust)Solved
Hi
Is it possible to make OnProjectileRicochet hook for RUST. I'm trying to make an analogue of the vis.attack function to draw the trajectories of suspicious projectiles. To do this, I need to save to the array all possible ricochets hitInfo of projectile. I was able to do the calculation only for one ricochet. But it does not work when ricochets are more than one.
Hi Wulf!

Please add the OnProjectileRicochet hook (BasePlayer) in the next umod update or in the development build.

		if (Interface.CallHook("OnProjectileRicochet", this, playerProjectileRicochet) != null)
        {
            return;
        }


	[FromOwner]
    [RPC_Server]
    public void OnProjectileRicochet(BaseEntity.RPCMessage msg)
    {
        BasePlayer.FiredProjectile firedProjectile;
        PlayerProjectileRicochet playerProjectileRicochet = PlayerProjectileRicochet.Deserialize(msg.read);
        if (playerProjectileRicochet == null)
        {
            return;
        }
        if (playerProjectileRicochet.hitPosition.IsNaNOrInfinity() || playerProjectileRicochet.inVelocity.IsNaNOrInfinity() || playerProjectileRicochet.outVelocity.IsNaNOrInfinity() || playerProjectileRicochet.hitNormal.IsNaNOrInfinity() || float.IsNaN(playerProjectileRicochet.travelTime) || float.IsInfinity(playerProjectileRicochet.travelTime))
        {
            AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat("Contains NaN (", playerProjectileRicochet.projectileID, ")"));
            playerProjectileRicochet.ResetToPool();
            playerProjectileRicochet = null;
            return;
        }
        if (!this.firedProjectiles.TryGetValue(playerProjectileRicochet.projectileID, out firedProjectile))
        {
            AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat("Missing ID (", playerProjectileRicochet.projectileID, ")"));
            playerProjectileRicochet.ResetToPool();
            playerProjectileRicochet = null;
            return;
        }
        if (firedProjectile.firedTime < Time.realtimeSinceStartup - 8f)
        {
            AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat("Lifetime is zero (", playerProjectileRicochet.projectileID, ")"));
            playerProjectileRicochet.ResetToPool();
            playerProjectileRicochet = null;
            return;
        }
        if (firedProjectile.protection >= 3)
        {
            Vector3 vector3 = firedProjectile.position + (firedProjectile.velocity.normalized * 0.001f);
            Vector3 vector31 = playerProjectileRicochet.hitPosition - (playerProjectileRicochet.inVelocity.normalized * 0.001f);
            if (!GamePhysics.LineOfSight(vector3, vector31, playerProjectileRicochet.hitPosition + (playerProjectileRicochet.outVelocity.normalized * 0.001f), 2162688, 0f))
            {
                string str = firedProjectile.projectilePrefab.name;
                AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat(new object[] { "Line of sight (", str, " on ricochet) ", vector3, " ", vector31 }));
                playerProjectileRicochet.ResetToPool();
                playerProjectileRicochet = null;
                return;
            }
        }
        float single = 0.03125f;
        Vector3 vector32 = firedProjectile.position;
        Vector3 vector33 = firedProjectile.velocity;
        float single1 = firedProjectile.partialTime;
        float single2 = Mathf.Clamp(playerProjectileRicochet.travelTime - firedProjectile.travelTime, 0f, 8f);
        Vector3 vector34 = Physics.gravity * firedProjectile.projectilePrefab.gravityModifier;
        float single3 = firedProjectile.projectilePrefab.drag;
        if (firedProjectile.protection >= 4)
        {
            this.SimulateProjectile(ref vector32, ref vector33, ref single1, single2, single, vector34, single3);
            Vector3 vector35 = playerProjectileRicochet.hitPosition - vector32;
            float single4 = vector35.Magnitude2D();
            float single5 = Mathf.Abs(vector35.y);
            if (single4 > AntiHack.projectile_trajectory_horizontal)
            {
                string str1 = firedProjectile.projectilePrefab.name;
                AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat(new object[] { "Horizontal trajectory (", str1, " on ricochet with ", single4, "m > ", AntiHack.projectile_trajectory_horizontal, "m)" }));
                playerProjectileRicochet.ResetToPool();
                playerProjectileRicochet = null;
                return;
            }
            if (single5 > AntiHack.projectile_trajectory_vertical)
            {
                string str2 = firedProjectile.projectilePrefab.name;
                AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat(new object[] { "Vertical trajectory (", str2, " on ricochet with ", single5, "m > ", AntiHack.projectile_trajectory_vertical, "m)" }));
                playerProjectileRicochet.ResetToPool();
                playerProjectileRicochet = null;
                return;
            }
        }
        if (firedProjectile.protection >= 5)
        {
            Vector3 vector36 = firedProjectile.position;
            Vector3 vector37 = playerProjectileRicochet.hitPosition;
            if (!GamePhysics.CheckSphere(vector37, 0.01f, 1269916433, QueryTriggerInteraction.UseGlobal))
            {
                string str3 = firedProjectile.projectilePrefab.name;
                AntiHack.Log(this, AntiHackType.ProjectileHack, string.Concat(new object[] { "Collider (", str3, " on ricochet) ", vector36, " ", vector37 }));
                playerProjectileRicochet.ResetToPool();
                playerProjectileRicochet = null;
                return;
            }
        }
		if (Interface.CallHook("OnProjectileRicochet", this, playerProjectileRicochet) != null)
        {
            return;
        }
        firedProjectile.position = playerProjectileRicochet.hitPosition;
        firedProjectile.velocity = playerProjectileRicochet.outVelocity;
        firedProjectile.travelTime = playerProjectileRicochet.travelTime;
        firedProjectile.partialTime = single1;
        this.firedProjectiles[playerProjectileRicochet.projectileID] = firedProjectile;
        playerProjectileRicochet.ResetToPool();
        playerProjectileRicochet = null;
    }
In response to Antidote ():
Hi Wulf!

Please add the OnProjectileRicochet hook (BasePlayer) in the next umod update or...
Added for the update today. Thanks for the request and sorry for the delay!
Locked automatically