Exemple #1
0
        private static void Prefix(BreakableWindow __instance, ref float damage)
        {
            var ev = new EventArgs.DamagingWindowEventArgs(__instance, damage);

            Handlers.Map.OnDamagingWindow(ev);
            damage = ev.Damage;
        }
Exemple #2
0
 // Token: 0x06000022 RID: 34 RVA: 0x00002C98 File Offset: 0x00000E98
 public static void Prefix(BreakableWindow __instance)
 {
     if (SameThings.WindowHealth < 1f || State.BreakableWindows.Contains(__instance))
     {
         return;
     }
     __instance.health = ((SameThings.WindowHealth == 0f) ? 9999999f : SameThings.WindowHealth);
     State.BreakableWindows.Add(__instance);
 }
 private static bool Prefix(BreakableWindow __instance, float damage) => !Handler.IsLobby;
Exemple #4
0
        public static bool Prefix(Grenades.Scp018Grenade __instance, Collision collision, float relativeSpeed)
        {
            //__instance.damageHurt = 0.95f
            //__instance.damageScpMultiplier = 4.85f

            Vector3 velocity = __instance.rb.velocity * __instance.bounceSpeedMultiplier;
            float   num      = __instance.topSpeedPerBounce[__instance.bounce];

            if (relativeSpeed > num)
            {
                __instance.rb.velocity = velocity.normalized * num;
                if (__instance.actionAllowed)
                {
                    __instance.bounce = Mathf.Min(__instance.bounce + 1, __instance.topSpeedPerBounce.Length - 1);
                }
            }
            else
            {
                if (relativeSpeed > __instance.source.maxDistance)
                {
                    __instance.source.maxDistance = relativeSpeed;
                }
                __instance.rb.velocity = velocity;
            }
            if (NetworkServer.active)
            {
                Collider collider = collision.collider;
                int      num2     = 1 << collider.gameObject.layer;
                if (num2 == __instance.layerGlass)
                {
                    if (__instance.actionAllowed && relativeSpeed >= __instance.breakpointGlass)
                    {
                        __instance.cooldown = __instance.cooldownGlass;
                        BreakableWindow component = collider.GetComponent <BreakableWindow>();
                        if (component != null)
                        {
                            component.ServerDamageWindow(relativeSpeed * __instance.damageGlass);
                        }
                    }
                }
                else if (num2 == __instance.layerDoor)
                {
                    if (relativeSpeed >= __instance.breakpointDoor)
                    {
                        __instance.cooldown = __instance.cooldownDoor;
                        Door componentInParent = collider.GetComponentInParent <Door>();
                        if (componentInParent != null && !componentInParent.GrenadesResistant)
                        {
                            componentInParent.DestroyDoor(b: true);
                        }
                    }
                }
                else if ((num2 == __instance.layerHitbox || num2 == __instance.layerIgnoreRaycast) && __instance.actionAllowed && relativeSpeed >= __instance.breakpointHurt)
                {
                    __instance.cooldown = __instance.cooldownHurt;
                    ReferenceHub componentInParent2 = collider.GetComponentInParent <ReferenceHub>();
                    if (componentInParent2 != null && (ServerConsole.FriendlyFire || componentInParent2.gameObject == __instance.thrower.gameObject || componentInParent2.weaponManager.GetShootPermission(__instance.throwerTeam)))
                    {
                        float num3 = relativeSpeed * __instance.damageHurt * Configs.scp018_damage_multiplier;

                        //componentInParent2.playerStats.ccm.CurClass != RoleType.Scp106 &&
                        if (componentInParent2.playerStats.ccm.Classes.SafeGet(componentInParent2.playerStats.ccm.CurClass).team == Team.SCP)
                        {
                            num3 *= __instance.damageScpMultiplier;
                        }

                        componentInParent2.playerStats.HurtPlayer(new PlayerStats.HitInfo(num3, __instance.logName, DamageTypes.Grenade, __instance.throwerGameObject.GetPlayer().GetPlayerId()), componentInParent2.playerStats.gameObject);
                    }
                }
                if (__instance.bounce >= __instance.topSpeedPerBounce.Length - 1 && relativeSpeed >= num && !__instance.hasHitMaxSpeed)
                {
                    __instance.NetworkfuseTime = NetworkTime.time + 10.0;
                    __instance.hasHitMaxSpeed  = true;
                }
            }
            //base.OnSpeedCollisionEnter(collision, relativeSpeed);
            return(false);
        }
        public static bool Prefix(FragGrenade __instance, ref bool __result)
        {
            Player thrower = Player.Get(__instance.thrower.gameObject);

            if (Tracking.PlayersWithSubclasses.ContainsKey(thrower) && Tracking.PlayersWithSubclasses[thrower].Abilities.Contains(AbilityType.HealGrenadeFrag))
            {
                UnityEngine.Collider[] colliders = UnityEngine.Physics.OverlapSphere(__instance.transform.position, 4);
                Subclass.Instance.map.UpdateHealths(colliders, thrower, "HealGrenadeFragHealAmount");
                return(false);
            }

            string str = (((Grenade)((EffectGrenade)__instance)).thrower != null) ? ((Grenade)((EffectGrenade)__instance)).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)");

            string[] textArray1 = new string[] { "Player ", (string)str, "'s ", (string)((Grenade)((EffectGrenade)__instance)).logName, " grenade exploded." };
            ServerLogs.AddLog(ServerLogs.Modules.Logger, string.Concat((string[])textArray1), ServerLogs.ServerLogType.GameEvent, false);

            if (((EffectGrenade)__instance).serverGrenadeEffect != null)
            {
                Transform transform = ((Grenade)((EffectGrenade)__instance)).transform;
                Object.Instantiate <GameObject>(((EffectGrenade)__instance).serverGrenadeEffect, transform.position, transform.rotation);
            }

            Vector3 position = ((EffectGrenade)__instance).transform.position;
            int     num      = 0;

            Collider[] colliderArray = Physics.OverlapSphere(position, __instance.chainTriggerRadius, (int)__instance.damageLayerMask);
            int        index         = 0;

            while (index < colliderArray.Length)
            {
                Collider        collider  = colliderArray[index];
                BreakableWindow component = collider.GetComponent <BreakableWindow>();
                if (component != null)
                {
                    if ((component.transform.position - position).sqrMagnitude <= __instance.sqrChainTriggerRadius)
                    {
                        component.ServerDamageWindow(500f);
                    }
                }
                else
                {
                    Door componentInParent = collider.GetComponentInParent <Door>();
                    if (componentInParent != null)
                    {
                        if ((!componentInParent.GrenadesResistant && (!componentInParent.commandlock && (!componentInParent.decontlock && !componentInParent.lockdown))) && ((componentInParent.transform.position - position).sqrMagnitude <= __instance.sqrChainTriggerRadius))
                        {
                            componentInParent.DestroyDoor(true);
                        }
                    }
                    else if (((__instance.chainLengthLimit == -1) || (__instance.chainLengthLimit > ((EffectGrenade)__instance).currentChainLength)) && ((__instance.chainConcurrencyLimit == -1) || (__instance.chainConcurrencyLimit > num)))
                    {
                        Pickup componentInChildren = collider.GetComponentInChildren <Pickup>();
                        if ((componentInChildren != null) && __instance.ChangeIntoGrenade(componentInChildren))
                        {
                            num = (int)(num + 1);
                        }
                    }
                }
                index = (int)(index + 1);
            }
            Player pthrower = Player.Get(((EffectGrenade)__instance).thrower.gameObject);

            foreach (GameObject obj2 in PlayerManager.players)
            {
                if (!ServerConsole.FriendlyFire && ((obj2 != ((EffectGrenade)__instance).thrower.gameObject) &&
                                                    (!obj2.GetComponent <WeaponManager>().GetShootPermission(((EffectGrenade)__instance).throwerTeam, false))) &&
                    !Tracking.PlayerHasFFToPlayer(pthrower, Player.Get(obj2)))
                {
                    Exiled.API.Features.Log.Debug($"Player {Player.Get(obj2)?.Nickname} could not be hurt from a grenade. Thrower has ff to player: {Tracking.PlayerHasFFToPlayer(pthrower, Player.Get(obj2))}", Subclass.Instance.Config.Debug);
                    continue;
                }
                PlayerStats component = obj2.GetComponent <PlayerStats>();
                if ((component != null) && component.ccm.InWorld)
                {
                    float amount = (float)(__instance.damageOverDistance.Evaluate(Vector3.Distance(position, component.transform.position)) * (component.ccm.IsHuman() ? ConfigFile.ServerConfig.GetFloat("human_grenade_multiplier", 0.7f) : ConfigFile.ServerConfig.GetFloat("scp_grenade_multiplier", 1f)));
                    if (amount > __instance.absoluteDamageFalloff)
                    {
                        Exiled.API.Features.Log.Debug($"Attempting to hurt player {Player.Get(obj2)?.Nickname} with a grenade", Subclass.Instance.Config.Debug);
                        Transform[] grenadePoints = component.grenadePoints;
                        index = 0;
                        while (true)
                        {
                            if (index < grenadePoints.Length)
                            {
                                Transform transform = grenadePoints[index];
                                if (Physics.Linecast(position, transform.position, (int)__instance.hurtLayerMask))
                                {
                                    index = (int)(index + 1);
                                    continue;
                                }
                                component.HurtPlayer(new PlayerStats.HitInfo(amount, (((EffectGrenade)__instance).thrower != null) ? ((EffectGrenade)__instance).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)"), DamageTypes.Grenade, ((EffectGrenade)__instance).thrower.hub.queryProcessor.PlayerId), obj2, false);
                            }
                            if (!component.ccm.IsAnyScp())
                            {
                                ReferenceHub hub      = ReferenceHub.GetHub(obj2);
                                float        duration = __instance.statusDurationOverDistance.Evaluate(Vector3.Distance(position, component.transform.position));
                                hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Burned>(), duration, false);
                                hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Concussed>(), duration, false);
                            }
                            break;
                        }
                    }
                }
            }

            __result = true;
            return(false);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="DamagingWindowEventArgs"/> class.
 /// </summary>
 /// <param name="window"><inheritdoc cref="Window"/></param>
 /// <param name="damage">The damage being dealt.</param>
 /// <param name="handler"><inheritdoc cref="Handler"/></param>
 public DamagingWindowEventArgs(BreakableWindow window, float damage, DamageHandlerBase handler)
 {
     Window         = Window.Get(window);
     Handler        = new CustomDamageHandler(handler is AttackerDamageHandler attackerDamageHandler ? Player.Get(attackerDamageHandler.Attacker.Hub) : null, handler);
     Handler.Damage = damage;
 }
Exemple #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="DamagingWindowEventArgs"/> class.
 /// </summary>
 /// <param name="window"><inheritdoc cref="Window"/></param>
 /// <param name="damage"><inheritdoc cref="Damage"/></param>
 public DamagingWindowEventArgs(BreakableWindow window, float damage)
 {
     Window = window;
     Damage = damage;
 }
Exemple #8
0
        public static bool Prefix(FragGrenade __instance, ref bool __result)
        {
            Player thrower = Player.Get(__instance.thrower.gameObject);

            Dictionary <Player, float> damages = new Dictionary <Player, float>();

            Vector3 position = ((EffectGrenade)__instance).transform.position;
            int     num      = 0;

            Collider[] colliderArray = Physics.OverlapSphere(position, __instance.chainTriggerRadius, (int)__instance.damageLayerMask);
            int        index         = 0;

            foreach (GameObject obj2 in PlayerManager.players)
            {
                if (!ServerConsole.FriendlyFire && ((obj2 != ((EffectGrenade)__instance).thrower.gameObject) &&
                                                    (!obj2.GetComponent <WeaponManager>().GetShootPermission(((EffectGrenade)__instance).throwerTeam, false))))
                {
                    continue;
                }
                PlayerStats component = obj2.GetComponent <PlayerStats>();
                if ((component != null) && component.ccm.InWorld)
                {
                    float amount = (float)(__instance.damageOverDistance.Evaluate(Vector3.Distance(position, component.transform.position)) * (component.ccm.IsHuman() ? ConfigFile.ServerConfig.GetFloat("human_grenade_multiplier", 0.7f) : ConfigFile.ServerConfig.GetFloat("scp_grenade_multiplier", 1f)));
                    damages.Add(Player.Get(obj2), amount);
                }
            }

            var ev = new ExplodingGrenadeEventArgs(thrower, damages, true, __instance.gameObject);

            Exiled.Events.Handlers.Map.OnExplodingGrenade(ev);

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

            while (index < colliderArray.Length)
            {
                Collider        collider  = colliderArray[index];
                BreakableWindow component = collider.GetComponent <BreakableWindow>();
                if (component != null)
                {
                    if ((component.transform.position - position).sqrMagnitude <= __instance.sqrChainTriggerRadius)
                    {
                        component.ServerDamageWindow(500f);
                    }
                }
                else
                {
                    DoorVariant componentInParent = collider.GetComponentInParent <DoorVariant>();
                    if (componentInParent != null && componentInParent is IDamageableDoor damageableDoor)
                    {
                        damageableDoor.ServerDamage(__instance.damageOverDistance.Evaluate(Vector3.Distance(position, componentInParent.transform.position)), DoorDamageType.Grenade);
                    }
                    else if (((__instance.chainLengthLimit == -1) || (__instance.chainLengthLimit > ((EffectGrenade)__instance).currentChainLength)) && ((__instance.chainConcurrencyLimit == -1) || (__instance.chainConcurrencyLimit > num)))
                    {
                        Pickup componentInChildren = collider.GetComponentInChildren <Pickup>();
                        if ((componentInChildren != null) && __instance.ChangeIntoGrenade(componentInChildren))
                        {
                            num = (int)(num + 1);
                        }
                    }
                }
                index = (int)(index + 1);
            }

            foreach (var item in damages)
            {
                if (item.Value > __instance.absoluteDamageFalloff)
                {
                    PlayerStats component     = item.Key.GameObject.GetComponent <PlayerStats>();
                    Transform[] grenadePoints = component.grenadePoints;
                    index = 0;
                    while (true)
                    {
                        if (index < grenadePoints.Length)
                        {
                            Transform transform = grenadePoints[index];
                            if (Physics.Linecast(position, transform.position, (int)__instance.hurtLayerMask))
                            {
                                index = (int)(index + 1);
                                continue;
                            }
                            component.HurtPlayer(new PlayerStats.HitInfo(item.Value, (((EffectGrenade)__instance).thrower != null) ? ((EffectGrenade)__instance).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)"), DamageTypes.Grenade, ((EffectGrenade)__instance).thrower.hub.queryProcessor.PlayerId), item.Key.GameObject, false);
                        }
                        if (!component.ccm.IsAnyScp())
                        {
                            ReferenceHub hub      = item.Key.ReferenceHub;
                            float        duration = __instance.statusDurationOverDistance.Evaluate(Vector3.Distance(position, component.transform.position));
                            hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Burned>(), duration, false);
                            hub.playerEffectsController.EnableEffect(hub.playerEffectsController.GetEffect <Concussed>(), duration, false);
                        }
                        break;
                    }
                }
            }

            //if (Tracking.PlayersWithSubclasses.ContainsKey(thrower) && Tracking.PlayersWithSubclasses[thrower].Abilities.Contains(AbilityType.HealGrenadeFrag))
            //{
            //	if (!Tracking.CanUseAbility(thrower, AbilityType.HealGrenadeFrag, Tracking.PlayersWithSubclasses[thrower]))
            //	{
            //		Tracking.DisplayCantUseAbility(thrower, AbilityType.HealGrenadeFrag, Tracking.PlayersWithSubclasses[thrower], "heal frag");
            //	}
            //	else
            //	{
            //		Tracking.UseAbility(thrower, AbilityType.HealGrenadeFrag, Tracking.PlayersWithSubclasses[thrower]);
            //		UnityEngine.Collider[] colliders = UnityEngine.Physics.OverlapSphere(__instance.transform.position, 4);
            //		Subclass.Instance.map.UpdateHealths(colliders, thrower, "HealGrenadeFragHealAmount");
            //		return false;
            //	}
            //}

            string str = (((Grenade)((EffectGrenade)__instance)).thrower != null) ? ((Grenade)((EffectGrenade)__instance)).thrower.hub.LoggedNameFromRefHub() : ((string)"(UNKNOWN)");

            string[] textArray1 = new string[] { "Player ", (string)str, "'s ", (string)((Grenade)((EffectGrenade)__instance)).logName, " grenade exploded." };
            ServerLogs.AddLog(ServerLogs.Modules.Logger, string.Concat((string[])textArray1), ServerLogs.ServerLogType.GameEvent, false);

            if (((EffectGrenade)__instance).serverGrenadeEffect != null)
            {
                Transform transform = ((Grenade)((EffectGrenade)__instance)).transform;
                Object.Instantiate <GameObject>(((EffectGrenade)__instance).serverGrenadeEffect, transform.position, transform.rotation);
            }

            __result = true;
            return(false);
        }
Exemple #9
0
        public static bool Prefix(Scp096 __instance)
        {
            if (!__instance.CanAttack)
            {
                return(false);
            }
            __instance._leftAttack = !__instance._leftAttack;
            __instance._attacking  = true;
            __instance.PlayerState = Scp096PlayerState.Attacking;
            Transform playerCameraReference = __instance.Hub.PlayerCameraReference;

            Collider[] array = Physics.OverlapSphere(playerCameraReference.position + playerCameraReference.forward * 1.25f, SCP096Re.instance.Config.re096_attack_radius, LayerMask.GetMask(new string[]
            {
                "PlyCenter",
                "Door",
                "Glass"
            }));
            HashSet <GameObject> hashSet = new HashSet <GameObject>();
            float num = 0f;

            foreach (Collider collider in array)
            {
                Door componentInParent = collider.GetComponentInParent <Door>();
                if (componentInParent != null)
                {
                    componentInParent.DestroyDoor(true);
                    if (componentInParent.destroyed && num < 0.5f)
                    {
                        num = 1f;
                    }
                }
                else
                {
                    BreakableWindow componentInParent2 = collider.GetComponentInParent <BreakableWindow>();
                    if (componentInParent2 != null && num < 0.25f)
                    {
                        componentInParent2.ServerDamageWindow(500f);
                        num = 0.5f;
                        break;
                    }
                    ReferenceHub componentInParent3 = collider.GetComponentInParent <ReferenceHub>();
                    if (!(componentInParent3 == null) && !(componentInParent3 == __instance.Hub) && hashSet.Add(componentInParent3.gameObject) && !Physics.Linecast(__instance.Hub.transform.position, componentInParent3.transform.position, LayerMask.GetMask(new string[]
                    {
                        "Default",
                        "Door",
                        "Glass"
                    })))
                    {
                        num = 1.2f;
                        if ((__instance._targets.Contains(componentInParent3) && SCP096Re.instance.Config.re096_hurt_targets_only) || !SCP096Re.instance.Config.re096_hurt_targets_only)
                        {
                            if (__instance.Hub.playerStats.HurtPlayer(new PlayerStats.HitInfo(9696f, __instance.Hub.LoggedNameFromRefHub(), DamageTypes.Scp096, componentInParent3.queryProcessor.PlayerId), componentInParent3.gameObject))
                            {
                                num = 1.35f;
                                __instance._targets.Remove(componentInParent3);
                                NetworkServer.SendToAll <Scp096OnKillMessage>(default(Scp096OnKillMessage), 0);
                            }
                        }
                    }
                }
            }
            if (num > 0f)
            {
                NetworkServer.SendToClientOfPlayer <Scp096HitmarkerMessage>(__instance.Hub.characterClassManager.netIdentity, new Scp096HitmarkerMessage(num));
            }
            __instance._attackDuration = 0.5f;
            return(false);
        }
        private void OnShooting(ShootingEventArgs ev)
        {
            if (CheckItem(ev.Shooter.CurrentItem))
            {
                ev.IsAllowed = false;

                try
                {
                    int bullets = Plugin.Singleton.Config.ItemConfigs.ShotgunCfg.SpreadCount;
                    if (ev.Shooter.CurrentItem.durability <= bullets)
                    {
                        bullets = (int)ev.Shooter.CurrentItem.durability;
                    }
                    Ray[] rays = new Ray[bullets];
                    for (int i = 0; i < rays.Length; i++)
                    {
                        Vector3 forward = ev.Shooter.CameraTransform.forward;
                        rays[i] = new Ray(ev.Shooter.CameraTransform.position + forward, RandomAimcone() * forward);
                    }

                    RaycastHit[] hits   = new RaycastHit[bullets];
                    bool[]       didHit = new bool[hits.Length];
                    for (int i = 0; i < hits.Length; i++)
                    {
                        didHit[i] = Physics.Raycast(rays[i], out hits[i], 500f, 1208246273);
                    }

                    WeaponManager component = ev.Shooter.ReferenceHub.weaponManager;
                    bool          confirm   = false;
                    for (int i = 0; i < hits.Length; i++)
                    {
                        try
                        {
                            if (!didHit[i])
                            {
                                continue;
                            }

                            HitboxIdentity hitbox = hits[i].collider.GetComponent <HitboxIdentity>();
                            if (hitbox != null)
                            {
                                Player target = Player.Get(hits[i].collider.GetComponentInParent <ReferenceHub>());

                                if (target == null)
                                {
                                    continue;
                                }

                                if (component.GetShootPermission(target.ReferenceHub.characterClassManager, Server.FriendlyFire))
                                {
                                    float damage = HitHandler(hitbox);
                                    if (target.Role == RoleType.Scp106)
                                    {
                                        damage /= 10;
                                    }

                                    float distance = Vector3.Distance(ev.Shooter.Position, target.Position);

                                    for (int f = 0; f < (int)distance; f++)
                                    {
                                        damage *= Plugin.Singleton.Config.ItemConfigs.ShotgunCfg.DamageFalloffModifier;
                                    }

                                    target.Hurt(damage,
                                                DamageTypes.FromWeaponId(ev.Shooter.ReferenceHub.weaponManager.curWeapon),
                                                ev.Shooter.Nickname, ev.Shooter.Id);
                                    component.RpcPlaceDecal(true, (sbyte)target.ReferenceHub.characterClassManager.Classes.SafeGet(target.Role).bloodType, hits[i].point + hits[i].normal * 0.01f, Quaternion.FromToRotation(Vector3.up, hits[i].normal));
                                    confirm = true;
                                }

                                continue;
                            }
                        }
                        catch (Exception e)
                        {
                            Log.Error($"{e}\n{e.StackTrace}");
                        }

                        BreakableWindow window = hits[i].collider.GetComponent <BreakableWindow>();
                        if (window != null)
                        {
                            window.ServerDamageWindow(Plugin.Singleton.Config.ItemConfigs.ShotgunCfg.BaseDamage);
                            confirm = true;
                            continue;
                        }

                        component.RpcPlaceDecal(false, component.curWeapon, hits[i].point + hits[i].normal * 0.01f,
                                                Quaternion.FromToRotation(Vector3.up, hits[i].normal));
                    }

                    for (int i = 0; i < bullets; i++)
                    {
                        component.RpcConfirmShot(confirm, component.curWeapon);
                    }

                    ev.Shooter.SetWeaponAmmo(ev.Shooter.CurrentItem, (int)ev.Shooter.CurrentItem.durability - bullets);
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }
            }
        }