public void PlayerAttack(BaseEntity.RPCMessage msg) { BasePlayer player = msg.player; if (!this.VerifyClientAttack(player)) { this.SendNetworkUpdate(BasePlayer.NetworkQueue.Update); } else { using (TimeWarning.New(nameof(PlayerAttack), 50L)) { using (PlayerAttack playerAttack = PlayerAttack.Deserialize((Stream)msg.read)) { if (playerAttack == null) { return; } HitInfo info = (HitInfo)Pool.Get <HitInfo>(); info.LoadFromAttack((Attack)playerAttack.attack, true); info.Initiator = (BaseEntity)player; info.Weapon = (AttackEntity)this; info.WeaponPrefab = (BaseEntity)this; info.Predicted = msg.connection; info.damageProperties = this.damageProperties; if (Interface.CallHook("OnMeleeAttack", (object)player, (object)info) != null) { return; } if (info.IsNaNOrInfinity()) { string shortPrefabName = this.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Contains NaN (" + shortPrefabName + ")"); player.stats.combat.Log(info, "melee_nan"); } else { if (ConVar.AntiHack.melee_protection > 0 && Object.op_Implicit((Object)info.HitEntity)) { bool flag = true; float num1 = 1f + ConVar.AntiHack.melee_forgiveness; double meleeClientframes = (double)ConVar.AntiHack.melee_clientframes; float meleeServerframes = ConVar.AntiHack.melee_serverframes; float num2 = (float)(meleeClientframes / 60.0); float num3 = meleeServerframes * Mathx.Max(Time.get_deltaTime(), Time.get_smoothDeltaTime(), Time.get_fixedDeltaTime()); float num4 = (player.desyncTime + num2 + num3) * num1; if (ConVar.AntiHack.projectile_protection >= 2) { double num5 = (double)info.HitEntity.MaxVelocity(); Vector3 parentVelocity = info.HitEntity.GetParentVelocity(); double magnitude = (double)((Vector3) ref parentVelocity).get_magnitude(); float num6 = (float)(num5 + magnitude); float num7 = info.HitEntity.BoundsPadding() + num4 * num6; float num8 = info.HitEntity.Distance(info.HitPositionWorld); if ((double)num8 > (double)num7) { string shortPrefabName1 = this.ShortPrefabName; string shortPrefabName2 = info.HitEntity.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Entity too far away (" + shortPrefabName1 + " on " + shortPrefabName2 + " with " + (object)num8 + "m > " + (object)num7 + "m in " + (object)num4 + "s)"); player.stats.combat.Log(info, "melee_distance"); flag = false; } } if (ConVar.AntiHack.melee_protection >= 1) { double num5 = (double)info.Initiator.MaxVelocity(); Vector3 parentVelocity = info.Initiator.GetParentVelocity(); double magnitude = (double)((Vector3) ref parentVelocity).get_magnitude(); float num6 = (float)(num5 + magnitude); float num7 = (float)((double)info.Initiator.BoundsPadding() + (double)num4 * (double)num6 + (double)num1 * (double)this.maxDistance); float num8 = info.Initiator.Distance(info.HitPositionWorld); if ((double)num8 > (double)num7) { string shortPrefabName1 = this.ShortPrefabName; string shortPrefabName2 = info.HitEntity.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Initiator too far away (" + shortPrefabName1 + " on " + shortPrefabName2 + " with " + (object)num8 + "m > " + (object)num7 + "m in " + (object)num4 + "s)"); player.stats.combat.Log(info, "melee_distance"); flag = false; } } if (ConVar.AntiHack.melee_protection >= 3) { Vector3 pointStart = info.PointStart; Vector3 position1 = Vector3.op_Addition(info.HitPositionWorld, Vector3.op_Multiply(((Vector3) ref info.HitNormalWorld).get_normalized(), 1f / 1000f)); Vector3 center = player.eyes.center; Vector3 position2 = player.eyes.position; Vector3 p2 = pointStart; Vector3 p3 = info.PositionOnRay(position1); Vector3 p4 = position1; int num5 = GamePhysics.LineOfSight(center, position2, p2, p3, p4, 2162688, 0.0f) ? 1 : 0; if (num5 == 0) { player.stats.Add("hit_" + info.HitEntity.Categorize() + "_indirect_los", 1, Stats.Server); } else { player.stats.Add("hit_" + info.HitEntity.Categorize() + "_direct_los", 1, Stats.Server); } if (num5 == 0) { string shortPrefabName1 = this.ShortPrefabName; string shortPrefabName2 = info.HitEntity.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Line of sight (" + shortPrefabName1 + " on " + shortPrefabName2 + ") " + (object)center + " " + (object)position2 + " " + (object)p2 + " " + (object)p3 + " " + (object)p4); player.stats.combat.Log(info, "melee_los"); flag = false; } } if (!flag) { AntiHack.AddViolation(player, AntiHackType.MeleeHack, ConVar.AntiHack.melee_penalty); return; } } player.metabolism.UseHeart(this.heartStress * 0.2f); using (TimeWarning.New("DoAttackShared", 50L)) this.DoAttackShared(info); } } } } }
public void PlayerAttack(BaseEntity.RPCMessage msg) { Vector3 parentVelocity; BasePlayer basePlayer = msg.player; if (!this.VerifyClientAttack(basePlayer)) { base.SendNetworkUpdate(BasePlayer.NetworkQueue.Update); return; } using (TimeWarning timeWarning = TimeWarning.New("PlayerAttack", (long)50)) { using (PlayerAttack playerAttack = PlayerAttack.Deserialize(msg.read)) { if (playerAttack != null) { HitInfo hitInfo = Facepunch.Pool.Get <HitInfo>(); hitInfo.LoadFromAttack(playerAttack.attack, true); hitInfo.Initiator = basePlayer; hitInfo.Weapon = this; hitInfo.WeaponPrefab = this; hitInfo.Predicted = msg.connection; hitInfo.damageProperties = this.damageProperties; if (Interface.CallHook("OnMeleeAttack", basePlayer, hitInfo) != null) { return; } if (!hitInfo.IsNaNOrInfinity()) { if (ConVar.AntiHack.melee_protection > 0 && hitInfo.HitEntity) { bool flag = true; float meleeForgiveness = 1f + ConVar.AntiHack.melee_forgiveness; float meleeClientframes = ConVar.AntiHack.melee_clientframes; float meleeServerframes = ConVar.AntiHack.melee_serverframes; float single = meleeClientframes / 60f; float single1 = meleeServerframes * Mathx.Max(UnityEngine.Time.deltaTime, UnityEngine.Time.smoothDeltaTime, UnityEngine.Time.fixedDeltaTime); float single2 = (basePlayer.desyncTime + single + single1) * meleeForgiveness; if (ConVar.AntiHack.projectile_protection >= 2) { float single3 = hitInfo.HitEntity.MaxVelocity(); parentVelocity = hitInfo.HitEntity.GetParentVelocity(); float single4 = single3 + parentVelocity.magnitude; float single5 = hitInfo.HitEntity.BoundsPadding() + single2 * single4; float single6 = hitInfo.HitEntity.Distance(hitInfo.HitPositionWorld); if (single6 > single5) { string shortPrefabName = base.ShortPrefabName; string str = hitInfo.HitEntity.ShortPrefabName; AntiHack.Log(basePlayer, AntiHackType.MeleeHack, string.Concat(new object[] { "Entity too far away (", shortPrefabName, " on ", str, " with ", single6, "m > ", single5, "m in ", single2, "s)" })); basePlayer.stats.combat.Log(hitInfo, "melee_distance"); flag = false; } } if (ConVar.AntiHack.melee_protection >= 1) { float single7 = hitInfo.Initiator.MaxVelocity(); parentVelocity = hitInfo.Initiator.GetParentVelocity(); float single8 = single7 + parentVelocity.magnitude; float single9 = hitInfo.Initiator.BoundsPadding() + single2 * single8 + meleeForgiveness * this.maxDistance; float single10 = hitInfo.Initiator.Distance(hitInfo.HitPositionWorld); if (single10 > single9) { string shortPrefabName1 = base.ShortPrefabName; string str1 = hitInfo.HitEntity.ShortPrefabName; AntiHack.Log(basePlayer, AntiHackType.MeleeHack, string.Concat(new object[] { "Initiator too far away (", shortPrefabName1, " on ", str1, " with ", single10, "m > ", single9, "m in ", single2, "s)" })); basePlayer.stats.combat.Log(hitInfo, "melee_distance"); flag = false; } } if (ConVar.AntiHack.melee_protection >= 3) { Vector3 pointStart = hitInfo.PointStart; Vector3 hitPositionWorld = hitInfo.HitPositionWorld + (hitInfo.HitNormalWorld.normalized * 0.001f); Vector3 vector3 = basePlayer.eyes.center; Vector3 vector31 = basePlayer.eyes.position; Vector3 vector32 = pointStart; Vector3 vector33 = hitInfo.PositionOnRay(hitPositionWorld); Vector3 vector34 = hitPositionWorld; bool flag1 = GamePhysics.LineOfSight(vector3, vector31, vector32, vector33, vector34, 2162688, 0f); if (flag1) { basePlayer.stats.Add(string.Concat("hit_", hitInfo.HitEntity.Categorize(), "_direct_los"), 1, Stats.Server); } else { basePlayer.stats.Add(string.Concat("hit_", hitInfo.HitEntity.Categorize(), "_indirect_los"), 1, Stats.Server); } if (!flag1) { string shortPrefabName2 = base.ShortPrefabName; string str2 = hitInfo.HitEntity.ShortPrefabName; AntiHack.Log(basePlayer, AntiHackType.MeleeHack, string.Concat(new object[] { "Line of sight (", shortPrefabName2, " on ", str2, ") ", vector3, " ", vector31, " ", vector32, " ", vector33, " ", vector34 })); basePlayer.stats.combat.Log(hitInfo, "melee_los"); flag = false; } } if (!flag) { AntiHack.AddViolation(basePlayer, AntiHackType.MeleeHack, ConVar.AntiHack.melee_penalty); return; } } basePlayer.metabolism.UseHeart(this.heartStress * 0.2f); using (TimeWarning timeWarning1 = TimeWarning.New("DoAttackShared", (long)50)) { this.DoAttackShared(hitInfo); } } else { string shortPrefabName3 = base.ShortPrefabName; AntiHack.Log(basePlayer, AntiHackType.MeleeHack, string.Concat("Contains NaN (", shortPrefabName3, ")")); basePlayer.stats.combat.Log(hitInfo, "melee_nan"); } } } } }
public void PlayerAttack(RPCMessage msg) { BasePlayer player = msg.player; if (!VerifyClientAttack(player)) { SendNetworkUpdate(); return; } using (TimeWarning.New("PlayerAttack", 50)) { using (PlayerAttack playerAttack = ProtoBuf.PlayerAttack.Deserialize(msg.read)) { if (playerAttack == null) { return; } HitInfo hitInfo = Facepunch.Pool.Get <HitInfo>(); hitInfo.LoadFromAttack(playerAttack.attack, true); hitInfo.Initiator = player; hitInfo.Weapon = this; hitInfo.WeaponPrefab = this; hitInfo.Predicted = msg.connection; hitInfo.damageProperties = damageProperties; if (Interface.CallHook("OnMeleeAttack", player, hitInfo) != null) { return; } if (hitInfo.IsNaNOrInfinity()) { string shortPrefabName = base.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Contains NaN (" + shortPrefabName + ")"); player.stats.combat.Log(hitInfo, "melee_nan"); return; } BaseEntity hitEntity = hitInfo.HitEntity; BasePlayer basePlayer = hitInfo.HitEntity as BasePlayer; bool flag = basePlayer != null; bool flag2 = flag && basePlayer.IsSleeping(); bool flag3 = flag && basePlayer.IsWounded(); bool flag4 = flag && basePlayer.isMounted; bool flag5 = flag && basePlayer.HasParent(); bool flag6 = hitEntity != null; bool flag7 = flag6 && hitEntity.IsNpc; if (ConVar.AntiHack.melee_protection <= 0) { goto IL_0903; } bool flag8 = true; float num = 1f + ConVar.AntiHack.melee_forgiveness; float melee_clientframes = ConVar.AntiHack.melee_clientframes; float melee_serverframes = ConVar.AntiHack.melee_serverframes; float num2 = melee_clientframes / 60f; float num3 = melee_serverframes * Mathx.Max(UnityEngine.Time.deltaTime, UnityEngine.Time.smoothDeltaTime, UnityEngine.Time.fixedDeltaTime); float num4 = (player.desyncTimeClamped + num2 + num3) * num; int layerMask = (ConVar.AntiHack.melee_terraincheck ? 10551296 : 2162688); if (flag && hitInfo.boneArea == (HitArea)(-1)) { string shortPrefabName2 = base.ShortPrefabName; string shortPrefabName3 = basePlayer.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Bone is invalid (" + shortPrefabName2 + " on " + shortPrefabName3 + " bone " + hitInfo.HitBone + ")"); player.stats.combat.Log(hitInfo, "melee_bone"); flag8 = false; } if (ConVar.AntiHack.melee_protection >= 2) { if (flag6) { float num5 = hitEntity.MaxVelocity() + hitEntity.GetParentVelocity().magnitude; float num6 = hitEntity.BoundsPadding() + num4 * num5; float num7 = hitEntity.Distance(hitInfo.HitPositionWorld); if (num7 > num6) { string shortPrefabName4 = base.ShortPrefabName; string shortPrefabName5 = hitEntity.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, "Entity too far away (" + shortPrefabName4 + " on " + shortPrefabName5 + " with " + num7 + "m > " + num6 + "m in " + num4 + "s)"); player.stats.combat.Log(hitInfo, "melee_target"); flag8 = false; } } if (ConVar.AntiHack.melee_protection >= 4 && flag8 && flag && !flag7 && !flag2 && !flag3 && !flag4 && !flag5) { float magnitude = basePlayer.GetParentVelocity().magnitude; float num8 = basePlayer.BoundsPadding() + num4 * magnitude + ConVar.AntiHack.tickhistoryforgiveness; float num9 = basePlayer.tickHistory.Distance(basePlayer, hitInfo.HitPositionWorld); if (num9 > num8) { string shortPrefabName6 = base.ShortPrefabName; string shortPrefabName7 = basePlayer.ShortPrefabName; AntiHack.Log(player, AntiHackType.ProjectileHack, "Player too far away (" + shortPrefabName6 + " on " + shortPrefabName7 + " with " + num9 + "m > " + num8 + "m in " + num4 + "s)"); player.stats.combat.Log(hitInfo, "player_distance"); flag8 = false; } } } if (ConVar.AntiHack.melee_protection >= 1) { if (ConVar.AntiHack.melee_protection >= 4) { float magnitude2 = player.GetParentVelocity().magnitude; float num10 = player.BoundsPadding() + num4 * magnitude2 + num * maxDistance; float num11 = player.tickHistory.Distance(player, hitInfo.HitPositionWorld); if (num11 > num10) { string shortPrefabName8 = base.ShortPrefabName; string text = (flag6 ? hitEntity.ShortPrefabName : "world"); AntiHack.Log(player, AntiHackType.MeleeHack, "Initiator too far away (" + shortPrefabName8 + " on " + text + " with " + num11 + "m > " + num10 + "m in " + num4 + "s)"); player.stats.combat.Log(hitInfo, "melee_initiator"); flag8 = false; } } else { float num12 = player.MaxVelocity() + player.GetParentVelocity().magnitude; float num13 = player.BoundsPadding() + num4 * num12 + num * maxDistance; float num14 = player.Distance(hitInfo.HitPositionWorld); if (num14 > num13) { string shortPrefabName9 = base.ShortPrefabName; string text2 = (flag6 ? hitEntity.ShortPrefabName : "world"); AntiHack.Log(player, AntiHackType.MeleeHack, "Initiator too far away (" + shortPrefabName9 + " on " + text2 + " with " + num14 + "m > " + num13 + "m in " + num4 + "s)"); player.stats.combat.Log(hitInfo, "melee_initiator"); flag8 = false; } } } if (ConVar.AntiHack.melee_protection >= 3) { if (flag6) { Vector3 pointStart = hitInfo.PointStart; Vector3 vector = hitInfo.HitPositionWorld + hitInfo.HitNormalWorld.normalized * 0.001f; Vector3 center = player.eyes.center; Vector3 position = player.eyes.position; Vector3 vector2 = pointStart; Vector3 vector3 = hitInfo.PositionOnRay(vector); Vector3 vector4 = vector; bool num15 = GamePhysics.LineOfSight(center, position, vector2, vector3, vector4, layerMask); if (!num15) { player.stats.Add("hit_" + hitEntity.Categorize() + "_indirect_los", 1, Stats.Server); } else { player.stats.Add("hit_" + hitEntity.Categorize() + "_direct_los", 1, Stats.Server); } if (!num15) { string shortPrefabName10 = base.ShortPrefabName; string shortPrefabName11 = hitEntity.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, string.Concat("Line of sight (", shortPrefabName10, " on ", shortPrefabName11, ") ", center, " ", position, " ", vector2, " ", vector3, " ", vector4)); player.stats.combat.Log(hitInfo, "melee_los"); flag8 = false; } } if (flag8 && flag && !flag7) { Vector3 vector5 = hitInfo.HitPositionWorld + hitInfo.HitNormalWorld.normalized * 0.001f; Vector3 position2 = basePlayer.eyes.position; Vector3 vector6 = basePlayer.CenterPoint(); if ((!GamePhysics.LineOfSight(vector5, position2, layerMask, 0f, ConVar.AntiHack.losforgiveness) || !GamePhysics.LineOfSight(position2, vector5, layerMask, ConVar.AntiHack.losforgiveness, 0f)) && (!GamePhysics.LineOfSight(vector5, vector6, layerMask, 0f, ConVar.AntiHack.losforgiveness) || !GamePhysics.LineOfSight(vector6, vector5, layerMask, ConVar.AntiHack.losforgiveness, 0f))) { string shortPrefabName12 = base.ShortPrefabName; string shortPrefabName13 = basePlayer.ShortPrefabName; AntiHack.Log(player, AntiHackType.MeleeHack, string.Concat("Line of sight (", shortPrefabName12, " on ", shortPrefabName13, ") ", vector5, " ", position2, " or ", vector5, " ", vector6)); player.stats.combat.Log(hitInfo, "melee_los"); flag8 = false; } } } if (flag8) { goto IL_0903; } AntiHack.AddViolation(player, AntiHackType.MeleeHack, ConVar.AntiHack.melee_penalty); goto end_IL_0031; IL_0903: player.metabolism.UseHeart(heartStress * 0.2f); using (TimeWarning.New("DoAttackShared", 50)) { DoAttackShared(hitInfo); } end_IL_0031 :; } } }