Example #1
0
        public static bool Prefix(RagdollManager __instance, Vector3 pos, Quaternion rot, int classId, PlayerStats.HitInfo ragdollInfo, bool allowRecall, string ownerID, string ownerNick, int playerId)
        {
            if (Configs.ragdoll_cleanup < 0)
            {
                return(true);
            }

            Log.Debug($"[RagdollCleanupPatch] {Enum.Parse(typeof(RoleType), classId.ToString())}{pos} Time:{Time.time} Cleanuptimes:{Configs.ragdoll_cleanup}");

            Role role = __instance.ccm.Classes.SafeGet(classId);

            if (role.model_ragdoll != null)
            {
                GameObject gameObject = UnityEngine.Object.Instantiate(role.model_ragdoll, pos + role.ragdoll_offset.position, Quaternion.Euler(rot.eulerAngles + role.ragdoll_offset.rotation));
                NetworkServer.Spawn(gameObject);
                gameObject.GetComponent <Ragdoll>().Networkowner       = new Ragdoll.Info(ownerID, ownerNick, ragdollInfo, role, playerId);
                gameObject.GetComponent <Ragdoll>().NetworkallowRecall = allowRecall;
                ragdolls.Add(gameObject, Time.time);
            }
            if (ragdollInfo.GetDamageType().isScp || ragdollInfo.GetDamageType() == DamageTypes.Pocket)
            {
                __instance.RegisterScpFrag();
            }
            else if (ragdollInfo.GetDamageType() == DamageTypes.Grenade)
            {
                RoundSummary.kills_by_frag++;
            }

            return(false);
        }
Example #2
0
        public static void Prefix(PlayerStats __instance, ref PlayerStats.HitInfo info, GameObject go)
        {
            try
            {
                if (go == null)
                {
                    return;
                }

                var killer = __instance.GetPlayer();

                if (info.GetDamageType() == DamageTypes.Grenade)
                {
                    killer = Player.GetPlayer(info.PlayerId);
                }

                var player = go.GetPlayer();

                Events.InvokePlayerHurtEvent(player, killer, ref info);

                if (player.GodMode)
                {
                    return;
                }

                if (player.Health + player.ArtificialHealth - info.Amount <= 0)
                {
                    Events.InvokePlayerDieEvent(player, killer, info);
                }
            }
            catch (Exception e)
            {
                Log.Error($"PlayerDamageEvent Error: {e}");
            }
        }
Example #3
0
 public static SimpleHitInfo Parse(this PlayerStats.HitInfo hitInfo)
 {
     return(new SimpleHitInfo()
     {
         Amount = hitInfo.Amount,
         Attacker = hitInfo.Attacker,
         Tool = hitInfo.Tool,
         DamageType = hitInfo.GetDamageType().Parse(),
         Time = hitInfo.Time
     });
 }
Example #4
0
 public static bool Prefix(Scp096 __instance, PlayerStats.HitInfo info)
 {
     if (info.GetDamageType().isWeapon&& SCP096Re.instance.Config.re096_damage_add_target)
     {
         GameObject playerObject = info.GetPlayerObject();
         if (playerObject != null && __instance.CanEnrage)
         {
             __instance.AddTarget(playerObject);
             __instance.Windup(false);
         }
     }
     __instance.TimeUntilShieldRecharge = 10f;
     return(false);
 }
Example #5
0
        public new bool HurtPlayer(PlayerStats.HitInfo info, GameObject go)
        {
            if (!go.GetComponent <CharacterClassManager>().isLocalPlayer&& info.GetDamageType() != DamageTypes.None && !go.GetComponent <CharacterClassManager>().GodMode)
            {
                //if (Commands.CustomInternalCommands.nodamageplayers.ContainsKey(go.GetComponent<RemoteAdmin.QueryProcessor>().PlayerId))
                //    info.Amount = 0;

                PheggPlayer pPlayer   = new PheggPlayer(go);
                PlayerStats Pstats    = go.GetComponent <PlayerStats>();
                PheggPlayer pAttacker = null;

                if (info.GetPlayerObject() != null)
                {
                    pAttacker = new PheggPlayer(info.GetPlayerObject());
                }

                if (Pstats.Health - info.Amount < 1)
                {
                    try
                    {
                        Base.Debug("Triggering PlayerDeathEvent");
                        PluginManager.TriggerEvent <IEventHandlerPlayerDeath>(new PlayerDeathEvent(pPlayer, pAttacker, info.Amount, info.GetDamageType()));
                    }
                    catch (Exception e)
                    {
                        Base.Error($"Error triggering PlayerDeathEvent: {e.InnerException.ToString()}");
                    }
                }
                else
                {
                    try
                    {
                        Base.Debug("Triggering PlayerHurtEvent");
                        PluginManager.TriggerEvent <IEventHandlerPlayerHurt>(new PlayerHurtEvent(pPlayer, pAttacker, info.Amount, info.GetDamageType()));
                    }
                    catch (Exception e)
                    {
                        Base.Error($"Error triggering PlayerHurtEvent: {e.InnerException.ToString()}");
                    }
                }
            }

            return(orig_HurtPlayer(info, go));
        }
Example #6
0
        public new void SpawnRagdoll(Vector3 pos, Quaternion rot, Vector3 velocity, int classId, PlayerStats.HitInfo ragdollInfo, bool allowRecall, string ownerID, string ownerNick, int playerId)
        {
            var ragdollDT = ragdollInfo.GetDamageType();


            if (PMConfigFile.enable008 && (ragdollDT == DamageTypes.Scp0492 || ragdollDT == DamageTypes.Poison))
            {
                return;
            }

            else if (ragdollDT == DamageTypes.Pocket)
            {
                var gos = new List <GameObject>(GameObject.FindGameObjectsWithTag("RoomID"));
                gos.AddRange(GameObject.FindGameObjectsWithTag("PD_EXIT"));

                var list = new List <Vector3>();

                foreach (GameObject go in gos)
                {
                    list.Add(go.transform.position);
                }

                foreach (Scp106PlayerScript scp106PlayerScript in FindObjectsOfType <Scp106PlayerScript>())
                {
                    if (scp106PlayerScript.portalPosition != Vector3.zero)
                    {
                        list.Add(scp106PlayerScript.portalPosition);
                    }
                }

                pos         = GetPos(list);
                allowRecall = false;
            }

            orig_SpawnRagdoll(pos, rot, velocity, classId, ragdollInfo, allowRecall, ownerID, ownerNick, playerId);
        }
Example #7
0
        public static void Prefix(PlayerStats __instance, ref PlayerStats.HitInfo info, GameObject go)
        {
            if (EventPlugin.PlayerHurtPatchDisable)
            {
                return;
            }
            try
            {
                if (info.GetDamageType() == DamageTypes.Pocket)
                {
                    bool allow = true;
                    Events.InvokePocketDimDamage(__instance.gameObject, ref allow);
                    if (!allow)
                    {
                        info.Amount = 0f;
                    }

                    if (info.Amount >= go.GetComponent <PlayerStats>().health)
                    {
                        Events.InvokePocketDimDeath(__instance.gameObject, ref allow);
                    }
                    if (!allow)
                    {
                        info.Amount = 0f;
                    }
                }

                if (info.GetDamageType() == DamageTypes.Grenade)
                {
                    Events.InvokePlayerHurt(__instance, ref info, go, info.PlyId);
                }
                else
                {
                    Events.InvokePlayerHurt(__instance, ref info, go);
                }

                if (info.Amount >= go.GetComponent <PlayerStats>().health || (go.GetComponent <PlayerStats>().health - info.Amount) <= 1f)
                {
                    CharacterClassManager ccm = go.GetComponent <CharacterClassManager>();
                    if (ccm != null)
                    {
                        if (DeathStuff.Contains(ccm.UserId))
                        {
                            return;
                        }
                        DeathStuff.Add(ccm.UserId);
                    }

                    if (info.GetDamageType() == DamageTypes.Grenade)
                    {
                        Events.InvokePlayerDeath(__instance, ref info, go, info.PlyId);
                    }
                    else
                    {
                        Events.InvokePlayerDeath(__instance, ref info, go);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error($"Player hurt/death event error: {e}");
            }
        }
Example #8
0
        private static bool Prefix(PlayerStats __instance, ref PlayerStats.HitInfo info, GameObject go)
        {
            try
            {
                if (go == null)
                {
                    return(true);
                }

                API.Features.Player attacker = API.Features.Player.Get(info.IsPlayer ? info.RHub.gameObject : __instance.gameObject);
                API.Features.Player target   = API.Features.Player.Get(go);

                if (target == null || target.IsHost)
                {
                    return(true);
                }

                if (info.GetDamageType() == DamageTypes.Recontainment && target.Role == RoleType.Scp079)
                {
                    Scp079.OnRecontained(new RecontainedEventArgs(target));
                    var eventArgs = new DiedEventArgs(null, target, info);
                    Player.OnDied(eventArgs);
                }

                if (attacker == null || attacker.IsHost)
                {
                    return(true);
                }

                var ev = new HurtingEventArgs(attacker, target, info);

                if (ev.Target.IsHost)
                {
                    return(true);
                }

                Player.OnHurting(ev);

                info = ev.HitInformations;

                if (!ev.IsAllowed)
                {
                    return(false);
                }

                if (!ev.Target.IsGodModeEnabled && (ev.Amount == -1 || ev.Amount >= ev.Target.Health + ev.Target.AdrenalineHealth))
                {
                    var dyingEventArgs = new DyingEventArgs(ev.Attacker, ev.Target, ev.HitInformations);

                    Player.OnDying(dyingEventArgs);

                    if (!dyingEventArgs.IsAllowed)
                    {
                        return(false);
                    }
                }

                return(true);
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"Exiled.Events.Patches.Events.Player.Hurting: {e}\n{e.StackTrace}");
                return(true);
            }
        }
Example #9
0
        internal static void CalculateFF(GameObject Victim, PlayerStats.HitInfo info, out float damage)
        {
            try
            {
                damage = info.Amount;

                if (!DetectorEnabled || !DoCheck || Victim.GetComponent <CharacterClassManager>().CurClass == RoleType.Spectator || (!info.GetDamageType().isWeapon&& info.GetDamageType() != DamageTypes.Grenade))
                {
                    return;
                }

                FFInfo ffInfo = new FFInfo
                {
                    DamageType = info.GetDamageType(),
                    HitInfo    = info,
                    Target     = ReferenceHub.GetHub(Victim),
                    Attacker   = ReferenceHub.GetHub(info.GetPlayerObject()),
                };

                if (ffInfo.Attacker.playerId == ffInfo.Target.playerId)
                {
                    return;
                }

                if (ffInfo.Target.characterClassManager.CurClass == RoleType.ClassD && ffInfo.Attacker.characterClassManager.CurClass == RoleType.ClassD)
                {
                    UpdateLegitDamage(ffInfo.Attacker.characterClassManager.UserId);
                    return;
                }

                if (ffInfo.DamageType == DamageTypes.Grenade)
                {
                    if (GrenadeThrowers.ContainsKey(ffInfo.Attacker.characterClassManager.UserId))
                    {
                        ffInfo.GrenadeThrower = GrenadeThrowers[ffInfo.Attacker.characterClassManager.UserId];

                        //Base.Info("FFInfoGrenadeThrower Set.");
                    }
                    else
                    {
                        ffInfo.GrenadeThrower = new GrenadeThrower
                        {
                            Role             = ffInfo.Attacker.characterClassManager.CurClass,
                            Team             = ffInfo.Attacker.characterClassManager.CurRole.team,
                            UserId           = ffInfo.Attacker.characterClassManager.UserId,
                            DetonatePosition = ffInfo.Target.playerMovementSync.RealModelPosition
                        };

                        //Base.Info("FFInfoGrenadeThrower Default.");
                    }

                    ffInfo.NearbyPlayers = GetNearbyPlayersGrenade(GrenadeThrowers[ffInfo.Attacker.characterClassManager.UserId].DetonatePosition);
                }
                else
                {
                    ffInfo.NearbyPlayers = GetNearbyPlayers(ffInfo);
                }

                if (ffInfo.Attacker.characterClassManager.CurRole.team == Team.RIP && ffInfo.DamageType == DamageTypes.Grenade)
                {
                    ffInfo.AttackerTeam = ffInfo.GrenadeThrower.Team;
                }

                //Base.Info(ffInfo.AttackerTeam.ToString());

                foreach (ReferenceHub hub in ffInfo.NearbyPlayers)
                {
                    if (IsFF(ffInfo, hub))
                    {
                        ffInfo.Friendlies.Add(hub);
                    }
                    else
                    {
                        ffInfo.Hostiles.Add(hub);
                    }
                }

                bool isFF = IsFF(ffInfo, ffInfo.Target);

                //Base.Info(isFF.ToString());

                if (DamageList.ContainsKey(ffInfo.Attacker.characterClassManager.UserId))
                {
                    ffInfo.LastLegitDamage = DamageList[ffInfo.Attacker.characterClassManager.UserId];
                }
                else
                {
                    ffInfo.LastLegitDamage = new DateTime();
                }

                if (isFF)
                {
                    if ((DateTime.Now - ffInfo.LastLegitDamage).TotalSeconds > 10 && (ffInfo.Hostiles.Count < 1 && ffInfo.Friendlies.Count > 0))
                    {
                        damage = 0;
                        HandleList(ffInfo);
                    }
                }
                else
                {
                    if (DamageList.ContainsKey(ffInfo.Attacker.characterClassManager.UserId))
                    {
                        ffInfo.LastLegitDamage = DateTime.Now;
                    }
                    else
                    {
                        DamageList.Add(ffInfo.Attacker.characterClassManager.UserId, DateTime.Now);
                    }
                }
            }
            catch (Exception e)
            {
                Base.Error(e.ToString());
                damage = info.Amount;
            }

            #region E
            //damage = info.Amount;

            //if (!DoCheck || Victim.GetComponent<CharacterClassManager>().CurClass == RoleType.Spectator)
            //	return;

            //DamageTypes.DamageType damageType = info.GetDamageType();
            //if (!damageType.isWeapon && damageType != DamageTypes.Grenade)
            //{
            //	updateLegitDamage(info.GetPlayerObject().GetComponent<CharacterClassManager>().UserId);
            //	return;
            //}

            //ReferenceHub vicHub = ReferenceHub.GetHub(Victim);
            //ReferenceHub attHub = ReferenceHub.GetHub(info.GetPlayerObject());

            //if (vicHub.characterClassManager.CurClass == RoleType.ClassD && attHub.characterClassManager.CurClass == RoleType.ClassD)
            //{
            //	updateLegitDamage(info.GetPlayerObject().GetComponent<CharacterClassManager>().UserId);
            //	return;
            //}

            //if (vicHub.playerId == attHub.playerId)
            //{
            //	updateLegitDamage(info.GetPlayerObject().GetComponent<CharacterClassManager>().UserId);
            //	return;
            //}

            //List<ReferenceHub> Hubs = new List<ReferenceHub>();
            //List<ReferenceHub> Hostiles = new List<ReferenceHub>();
            //List<ReferenceHub> Friendlies = new List<ReferenceHub>();

            //if (info.GetDamageType() == DamageTypes.Grenade)
            //{
            //	if (GrenadeThrowers.ContainsKey(attHub.characterClassManager.UserId))
            //		Hubs = GetNearbyPlayersGrenade(GrenadeThrowers[attHub.characterClassManager.UserId].DetonatePosition);
            //}
            //else
            //	Hubs = GetNearbyPlayers(attHub, Victim);

            //Team attackerTeam = Team.RIP;

            //if (attHub.characterClassManager.CurClass == RoleType.Spectator && info.GetDamageType() == DamageTypes.Grenade)
            //{
            //	if (GrenadeThrowers.ContainsKey(attHub.characterClassManager.UserId))
            //	{
            //		attackerTeam = GrenadeThrowers[attHub.characterClassManager.UserId].Team;
            //	}
            //}
            //else
            //	attackerTeam = attHub.characterClassManager.CurRole.team;

            //foreach (ReferenceHub hub in Hubs)
            //{
            //	if (!IsFF(attHub, hub, attackerTeam))
            //		Hostiles.Add(hub);
            //	else
            //		Friendlies.Add(hub);
            //}


            //if (!DamageList.ContainsKey(attHub.characterClassManager.UserId) || (DateTime.Now - DamageList[attHub.characterClassManager.UserId]).TotalSeconds > 9)
            //{
            //	if (Friendlies.Count > 0 && Hostiles.Count < 1)
            //	{
            //		damage = 0;

            //		HandleList(attHub, info, Victim, Friendlies, Hostiles);
            //	}
            //}
            //else
            //{
            //AddLegitDamage:
            //	updateLegitDamage(info.GetPlayerObject().GetComponent<CharacterClassManager>().UserId);
            //}
            #endregion
        }
        public static void Prefix(PlayerStats __instance, ref PlayerStats.HitInfo info, GameObject go)
        {
            if (EventPlugin.PlayerHurtPatchDisable)
            {
                return;
            }

            try
            {
                if (go == null)                 // As far as I remember, it's possible @iRebbok
                {
                    return;
                }

                var goReferenceHub = ReferenceHub.GetHub(go);

                // observe the order of calling the event, first there is damage to the player
                if (info.GetDamageType() == DamageTypes.Grenade)
                {
                    Events.InvokePlayerHurt(__instance, ref info, go, info.PlyId);
                }
                else
                {
                    Events.InvokePlayerHurt(__instance, ref info, go);
                }

                // GodMode players can't die
                if (goReferenceHub.characterClassManager.GodMode)
                {
                    return;
                }

                bool isDied = goReferenceHub.playerStats.health - info.Amount < 1f;

                // If the last attack was from the 'ARTIFICIALDEGEN', then hp not change
                if (goReferenceHub.playerStats.unsyncedArtificialHealth > 0f && !goReferenceHub.playerStats.lastHitInfo.Attacker.Equals("ARTIFICIALDEGEN"))
                {
                    // reduced attack damage for unsyncedHp
                    var reducedDamage = info.Amount * goReferenceHub.playerStats.artificialNormalRatio;
                    // the remainder of the damage
                    var remainderDamage = info.Amount - reducedDamage;

                    var finalUnsyncedHp = goReferenceHub.playerStats.unsyncedArtificialHealth - reducedDamage;
                    if (finalUnsyncedHp < 0f)
                    {
                        remainderDamage += Mathf.Abs(goReferenceHub.playerStats.unsyncedArtificialHealth);
                        goReferenceHub.playerStats.unsyncedArtificialHealth = 0f;
                    }
                    var finalHp = goReferenceHub.playerStats.health - remainderDamage;

                    // Don't use bitwise operations,
                    // this is the hp that will remain after everything
                    isDied = finalHp < 1f;
                }

                if (info.GetDamageType() == DamageTypes.Pocket)
                {
                    bool allow = true;

                    Events.InvokePocketDimDamage(__instance.gameObject, ref allow);

                    if (!allow)
                    {
                        info.Amount = 0f;
                    }

                    if (isDied)
                    {
                        Events.InvokePocketDimDeath(__instance.gameObject, ref allow);
                    }

                    if (!allow)
                    {
                        info.Amount = 0f;
                    }
                }

                // don't need to check if it contains more damage
                if (isDied)
                {
                    // I don't think that's possible
                    // ReferenceHub can't be without CharterClassManager
                    //if (goReferenceHub.characterClassManager != null)
                    //{

                    // Checking to re-call the event for this player??? Does it work?
                    //
                    if (DeathStuff.Contains(goReferenceHub.characterClassManager.UserId))
                    {
                        return;
                    }

                    DeathStuff.Add(goReferenceHub.characterClassManager.UserId);
                    //}

                    if (info.GetDamageType() == DamageTypes.Grenade)
                    {
                        Events.InvokePlayerDeath(__instance, ref info, go, info.PlyId);
                    }
                    else
                    {
                        Events.InvokePlayerDeath(__instance, ref info, go);
                    }
                }
            }
            catch (Exception exception)
            {
                Log.Error($"PocketDimDamageEvent/PocketDimDeathEvent/PlayerHurtEvent error: {exception}");
            }
        }
        private static bool Prefix(PlayerStats __instance, out bool __result, PlayerStats.HitInfo info, GameObject go, bool noTeamDamage = false, bool IsValidDamage = true)
        {
            try
            {
                __result = false;
                var player = go?.GetPlayer();
                var killer = __instance?.GetPlayer();
                if (player == null)
                {
                    return(false);
                }

                if (info.GetDamageType() == DamageTypes.Grenade)
                {
                    killer = SynapseController.Server.GetPlayer(info.PlayerId);
                }
                else if (info.GetDamageType() == DamageTypes.Pocket)
                {
                    killer = Server.Get.Players.FirstOrDefault(x => x.Scp106Controller.PocketPlayers.Contains(player));

                    if (SynapseExtensions.CanNotHurtByScp(player))
                    {
                        return(false);
                    }
                }

                bool         flag         = false;
                bool         flag2        = false;
                bool         flag3        = go == null;
                ReferenceHub referenceHub = flag3 ? null : ReferenceHub.GetHub(go);

                if (info.Amount < 0f)
                {
                    if (flag3)
                    {
                        info.Amount = Mathf.Abs(999999f);
                    }
                    else
                    {
                        info.Amount = ((referenceHub.playerStats != null) ? Mathf.Abs(referenceHub.playerStats.Health + referenceHub.playerStats.syncArtificialHealth + 10f) : Mathf.Abs(999999f));
                    }
                }

                if (__instance._burned.Enabled)
                {
                    info.Amount *= __instance._burned.DamageMult;
                }

                if (info.Amount > 2.14748365E+09f)
                {
                    info.Amount = 2.14748365E+09f;
                }

                if (info.GetDamageType().isWeapon&& referenceHub.characterClassManager.IsAnyScp() && info.GetDamageType() != DamageTypes.MicroHid)
                {
                    info.Amount *= __instance.weaponManager.weapons[(int)__instance.weaponManager.curWeapon].scpDamageMultiplier;
                }

                if (flag3)
                {
                    __result = false;
                    return(false);
                }

                PlayerStats           playerStats           = referenceHub.playerStats;
                CharacterClassManager characterClassManager = referenceHub.characterClassManager;

                if (playerStats == null || characterClassManager == null)
                {
                    __result = false;
                    return(false);
                }

                if (characterClassManager.GodMode)
                {
                    __result = false;
                    return(false);
                }

                if (__instance.ccm.CurRole.team == Team.SCP && __instance.ccm.Classes.SafeGet(characterClassManager.CurClass).team == Team.SCP && __instance.ccm != characterClassManager)
                {
                    __result = false;
                    return(false);
                }

                if (characterClassManager.SpawnProtected && !__instance._allowSPDmg)
                {
                    __result = false;
                    return(false);
                }

                bool flag4 = !noTeamDamage && info.IsPlayer && referenceHub != info.RHub && referenceHub.characterClassManager.Fraction == info.RHub.characterClassManager.Fraction;

                if (flag4)
                {
                    info.Amount *= PlayerStats.FriendlyFireFactor;
                }

                float health = playerStats.Health;

                if (__instance.lastHitInfo.Attacker == "ARTIFICIALDEGEN")
                {
                    playerStats.unsyncedArtificialHealth -= info.Amount;
                    if (playerStats.unsyncedArtificialHealth < 0f)
                    {
                        playerStats.unsyncedArtificialHealth = 0f;
                    }
                }
                else
                {
                    var allow = true;
                    try
                    {
                        Server.Get.Events.Player.InvokePlayerDamageEvent(player, killer, ref info, out allow);
                    }
                    catch (Exception e)
                    {
                        SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDamage Event failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    if (!allow)
                    {
                        __result = false;
                        return(false);
                    }

                    if (playerStats.unsyncedArtificialHealth > 0f)
                    {
                        float num  = info.Amount * playerStats.artificialNormalRatio;
                        float num2 = info.Amount - num;
                        playerStats.unsyncedArtificialHealth -= num;
                        if (playerStats.unsyncedArtificialHealth < 0f)
                        {
                            num2 += Mathf.Abs(playerStats.unsyncedArtificialHealth);
                            playerStats.unsyncedArtificialHealth = 0f;
                        }
                        playerStats.Health -= num2;
                        if (playerStats.Health > 0f && playerStats.Health - num <= 0f && characterClassManager.CurRole.team != Team.SCP)
                        {
                            __instance.TargetAchieve(characterClassManager.connectionToClient, "didntevenfeelthat");
                        }
                    }
                    else
                    {
                        playerStats.Health -= info.Amount;
                    }

                    if (playerStats.Health < 0f)
                    {
                        playerStats.Health = 0f;
                    }

                    playerStats.lastHitInfo = info;
                }
                PlayableScpsController component = go.GetComponent <PlayableScpsController>();
                if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IDamagable damagable)
                {
                    damagable.OnDamage(info);
                }

                if (playerStats.Health < 1f && characterClassManager.CurClass != RoleType.Spectator)
                {
                    if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IImmortalScp immortalScp && !immortalScp.OnDeath(info, __instance.gameObject))
                    {
                        __result = false;
                        return(false);
                    }
                    foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
                    {
                        Scp079Interactable.ZoneAndRoom otherRoom = go.GetComponent <Scp079PlayerScript>().GetOtherRoom();
                        bool flag5 = false;
                        foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f, __instance._filters))
                        {
                            foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable.currentZonesAndRooms)
                            {
                                if (zoneAndRoom.currentZone == otherRoom.currentZone && zoneAndRoom.currentRoom == otherRoom.currentRoom)
                                {
                                    flag5 = true;
                                }
                            }
                        }

                        if (flag5)
                        {
                            scp079PlayerScript.RpcGainExp(ExpGainType.KillAssist, characterClassManager.CurClass);
                        }
                    }

                    if (RoundSummary.RoundInProgress() && RoundSummary.roundTime < 60 && IsValidDamage)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "wowreally");
                    }

                    if (__instance.isLocalPlayer && info.PlayerId != referenceHub.queryProcessor.PlayerId)
                    {
                        RoundSummary.Kills++;
                    }

                    flag = true;

                    if (characterClassManager.CurClass == RoleType.Scp096)
                    {
                        ReferenceHub hub = ReferenceHub.GetHub(go);

                        if (hub != null && hub.scpsController.CurrentScp is PlayableScps.Scp096 && (hub.scpsController.CurrentScp as PlayableScps.Scp096).PlayerState == PlayableScps.Scp096PlayerState.Enraging)
                        {
                            __instance.TargetAchieve(characterClassManager.connectionToClient, "unvoluntaryragequit");
                        }
                    }
                    else if (info.GetDamageType() == DamageTypes.Pocket)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "newb");
                    }
                    else if (info.GetDamageType() == DamageTypes.Scp173)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "firsttime");
                    }
                    else if (info.GetDamageType() == DamageTypes.Grenade && info.PlayerId == referenceHub.queryProcessor.PlayerId)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "iwanttobearocket");
                    }
                    else if (info.GetDamageType().isWeapon)
                    {
                        Inventory inventory = referenceHub.inventory;
                        if (characterClassManager.CurClass == RoleType.Scientist)
                        {
                            Item itemByID = inventory.GetItemByID(inventory.curItem);
                            if (itemByID != null && itemByID.itemCategory == ItemCategory.Keycard && __instance.GetComponent <CharacterClassManager>().CurClass == RoleType.ClassD)
                            {
                                __instance.TargetAchieve(__instance.connectionToClient, "betrayal");
                            }
                        }

                        if (Time.realtimeSinceStartup - __instance._killStreakTime > 30f || __instance._killStreak == 0)
                        {
                            __instance._killStreak     = 0;
                            __instance._killStreakTime = Time.realtimeSinceStartup;
                        }

                        if (__instance.GetComponent <WeaponManager>().GetShootPermission(characterClassManager, true))
                        {
                            __instance._killStreak++;
                        }

                        if (__instance._killStreak >= 5)
                        {
                            __instance.TargetAchieve(__instance.connectionToClient, "pewpew");
                        }

                        if ((__instance.ccm.CurRole.team == Team.MTF || __instance.ccm.Classes.SafeGet(__instance.ccm.CurClass).team == Team.RSC) && characterClassManager.CurClass == RoleType.ClassD)
                        {
                            __instance.TargetStats(__instance.connectionToClient, "dboys_killed", "justresources", 50);
                        }
                    }
                    else if (__instance.ccm.CurRole.team == Team.SCP && go.GetComponent <MicroHID>().CurrentHidState != MicroHID.MicroHidState.Idle)
                    {
                        __instance.TargetAchieve(__instance.connectionToClient, "illpassthanks");
                    }

                    if (player.RealTeam == Team.RSC && player.RealTeam == Team.SCP)
                    {
                        __instance.TargetAchieve(__instance.connectionToClient, "timetodoitmyself");
                    }

                    bool flag6 = info.IsPlayer && referenceHub == info.RHub;
                    flag2 = flag4;

                    if (flag6)
                    {
                        ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[]
                        {
                            referenceHub.LoggedNameFromRefHub(),
                            " playing as ",
                            referenceHub.characterClassManager.CurRole.fullName,
                            " committed a suicide using ",
                            info.GetDamageName(),
                            "."
                        }), ServerLogs.ServerLogType.Suicide, false);
                    }
                    else
                    {
                        ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[]
                        {
                            referenceHub.LoggedNameFromRefHub(),
                            " playing as ",
                            referenceHub.characterClassManager.CurRole.fullName,
                            " has been killed by ",
                            info.Attacker,
                            " using ",
                            info.GetDamageName(),
                            info.IsPlayer ? (" playing as " + info.RHub.characterClassManager.CurRole.fullName + ".") : "."
                        }), flag2 ? ServerLogs.ServerLogType.Teamkill : ServerLogs.ServerLogType.KillLog, false);
                    }

                    if (info.GetDamageType().isScp || info.GetDamageType() == DamageTypes.Pocket)
                    {
                        RoundSummary.kills_by_scp++;
                    }

                    else if (info.GetDamageType() == DamageTypes.Grenade)
                    {
                        RoundSummary.kills_by_frag++;
                    }

                    try
                    {
                        Server.Get.Events.Player.InvokePlayerDeathEvent(player, killer, info);
                    }

                    catch (Exception e)
                    {
                        SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDeath Event failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    if (!__instance._pocketCleanup || info.GetDamageType() != DamageTypes.Pocket)
                    {
                        referenceHub.inventory.ServerDropAll();
                        PlayerMovementSync playerMovementSync = referenceHub.playerMovementSync;
                        if (characterClassManager.Classes.CheckBounds(characterClassManager.CurClass) && info.GetDamageType() != DamageTypes.RagdollLess)
                        {
                            __instance.GetComponent <RagdollManager>().SpawnRagdoll(go.transform.position, go.transform.rotation, (playerMovementSync == null) ? Vector3.zero : playerMovementSync.PlayerVelocity, (int)characterClassManager.CurClass, info, characterClassManager.CurRole.team > Team.SCP, go.GetComponent <Dissonance.Integrations.MirrorIgnorance.MirrorIgnorancePlayer>().PlayerId, referenceHub.nicknameSync.DisplayName, referenceHub.queryProcessor.PlayerId);
                        }
                    }
                    else
                    {
                        referenceHub.inventory.Clear();
                    }

                    characterClassManager.NetworkDeathPosition = go.transform.position;

                    if (characterClassManager.CurRole.team == Team.SCP)
                    {
                        if (characterClassManager.CurClass == RoleType.Scp0492)
                        {
                            NineTailedFoxAnnouncer.CheckForZombies(go);
                        }
                        else
                        {
                            GameObject x = null;
                            foreach (GameObject gameObject in PlayerManager.players)
                            {
                                if (gameObject.GetComponent <RemoteAdmin.QueryProcessor>().PlayerId == info.PlayerId)
                                {
                                    x = gameObject;
                                }
                            }
                            if (x != null)
                            {
                                NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, string.Empty);
                            }
                            else
                            {
                                DamageTypes.DamageType damageType = info.GetDamageType();
                                if (damageType == DamageTypes.Tesla)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "TESLA");
                                }
                                else if (damageType == DamageTypes.Nuke)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "WARHEAD");
                                }
                                else if (damageType == DamageTypes.Decont)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "DECONTAMINATION");
                                }
                                else if (characterClassManager.CurClass != RoleType.Scp079)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "UNKNOWN");
                                }
                            }
                        }
                    }

                    playerStats.SetHPAmount(100);
                    characterClassManager.SetClassID(RoleType.Spectator);

                    player.CustomRole = null;
                    foreach (var larry in Server.Get.Players.Where(x => x.Scp106Controller.PocketPlayers.Contains(player)))
                    {
                        larry.Scp106Controller.PocketPlayers.Remove(player);
                    }
                }
                else
                {
                    Vector3 pos  = Vector3.zero;
                    float   num3 = 40f;
                    if (info.GetDamageType().isWeapon)
                    {
                        GameObject playerOfID = __instance.GetPlayerOfID(info.PlayerId);
                        if (playerOfID != null)
                        {
                            pos  = go.transform.InverseTransformPoint(playerOfID.transform.position).normalized;
                            num3 = 100f;
                        }
                    }
                    else if (info.GetDamageType() == DamageTypes.Pocket)
                    {
                        PlayerMovementSync component2 = __instance.ccm.GetComponent <PlayerMovementSync>();
                        if (component2.RealModelPosition.y > -1900f)
                        {
                            component2.OverridePosition(Vector3.down * 1998.5f, 0f, true);
                        }
                    }
                    __instance.TargetBloodEffect(go.GetComponent <NetworkIdentity>().connectionToClient, pos, Mathf.Clamp01(info.Amount / num3));
                }
                Respawning.RespawnTickets singleton = Respawning.RespawnTickets.Singleton;
                Team team = characterClassManager.CurRole.team;
                byte b    = (byte)team;
                if (b != 0)
                {
                    if (b == 3)
                    {
                        if (flag)
                        {
                            Team team2 = __instance.ccm.Classes.SafeGet(characterClassManager.CurClass).team;
                            if (team2 == Team.CDP && team2 == Team.CHI)
                            {
                                singleton.GrantTickets(Respawning.SpawnableTeamType.ChaosInsurgency, __instance._respawn_tickets_ci_scientist_died_count, false);
                            }
                        }
                    }
                }
                else if (characterClassManager.CurClass != RoleType.Scp0492)
                {
                    for (float num4 = 1f; num4 > 0f; num4 -= __instance._respawn_tickets_mtf_scp_hurt_interval)
                    {
                        float num5 = (float)playerStats.maxHP * num4;
                        if (health > num5 && playerStats.Health < num5)
                        {
                            singleton.GrantTickets(Respawning.SpawnableTeamType.NineTailedFox, __instance._respawn_tickets_mtf_scp_hurt_count, false);
                        }
                    }
                }

                if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IDamagable damagable2)
                {
                    damagable2.OnDamage(info);
                }

                if (!flag4 || FriendlyFireConfig.PauseDetector || PermissionsHandler.IsPermitted(info.RHub.serverRoles.Permissions, PlayerPermissions.FriendlyFireDetectorImmunity))
                {
                    __result = flag;
                    return(false);
                }

                if (FriendlyFireConfig.IgnoreClassDTeamkills && referenceHub.characterClassManager.CurRole.team == Team.CDP && info.RHub.characterClassManager.CurRole.team == Team.CDP)
                {
                    __result = flag;
                    return(false);
                }

                if (flag2)
                {
                    if (info.RHub.FriendlyFireHandler.Respawn.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Window.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Life.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Round.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                }

                if (info.RHub.FriendlyFireHandler.Respawn.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                if (info.RHub.FriendlyFireHandler.Window.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                if (info.RHub.FriendlyFireHandler.Life.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                info.RHub.FriendlyFireHandler.Round.RegisterDamage(info.Amount);
                __result = flag;
                return(false);
            }
            catch (Exception e)
            {
                SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDamage Patch failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                __result = false;
                return(true);
            }
        }