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;
}