コード例 #1
0
 /// <inheritdoc/>
 protected override void OnExploding(ExplodingGrenadeEventArgs ev)
 {
     if (ev.Grenade.TryGetComponent(out Grenade grenade))
     {
         PlacedCharges.Remove(grenade);
     }
 }
コード例 #2
0
ファイル: Scp575.cs プロジェクト: joker-119/SCP-575
        private void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (ev.GrenadeType == GrenadeType.Flashbang)
            {
                foreach (Player player in TrackedPlayers)
                {
                    float dist = Vector3.Distance(ev.Grenade.transform.position, player.Position);
                    if (dist <= 20f)
                    {
                        if (Physics.Linecast(ev.Grenade.transform.position, player.Position, player.ReferenceHub.playerMovementSync.CollidableSurfaces))
                        {
                            return;
                        }
                        float damage = FlashbangBaseDamage - (dist * FlashbangFalloffMultiplier);
                        if (damage < 0)
                        {
                            damage = 0f;
                        }
                        else if (damage > FlashbangBaseDamage)
                        {
                            damage = FlashbangBaseDamage;
                        }

                        Log.Debug($"{nameof(OnExplodingGrenade)}: Damage: {damage} - {dist} {player.Nickname}", Plugin.Singleton.Config.Debug);
                        player.Hurt(new ExplosionDamageHandler(ev.Thrower != null ? ev.Thrower.Footprint : new Footprint(Server.Host.ReferenceHub), Vector3.zero, damage, 0));
                        DoFlashEffect(player, dist);
                    }
                }
            }
        }
コード例 #3
0
 public void UpdateHealths(ExplodingGrenadeEventArgs ev, string type)
 {
     UnityEngine.Collider[] colliders = UnityEngine.Physics.OverlapSphere(ev.Grenade.transform.position, 4);
     foreach (UnityEngine.Collider collider in colliders.Where(c => c.name == "Player"))
     {
         EPlayer player = EPlayer.Get(collider.gameObject);
         if (player != null && player.Team == ev.Thrower.Team)
         {
             if (TrackingAndMethods.PlayersWithSubclasses.ContainsKey(player) && TrackingAndMethods.PlayersWithSubclasses[player].Abilities.Contains(AbilityType.CantHeal))
             {
                 return;
             }
             if (TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].FloatOptions.ContainsKey(type))
             {
                 if (TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].FloatOptions[type] + player.Health > player.MaxHealth)
                 {
                     player.Health = player.MaxHealth;
                 }
                 else
                 {
                     player.Health += TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].FloatOptions[type];
                 }
             }
             else
             {
                 player.Health = player.MaxHealth;
             }
         }
     }
 }
コード例 #4
0
        private static bool Prefix(FragGrenade __instance)
        {
            Vector3 position = __instance.transform.position;
            List <API.Features.Player> players = new List <API.Features.Player>();

            foreach (GameObject gameObject in PlayerManager.players)
            {
                if (ServerConsole.FriendlyFire || !(gameObject != __instance.thrower.gameObject) || gameObject.GetComponent <WeaponManager>().GetShootPermission(__instance.throwerTeam, false))
                {
                    PlayerStats component2 = gameObject.GetComponent <PlayerStats>();
                    if (component2 == null || !component2.ccm.InWorld)
                    {
                        continue;
                    }

                    float num2 = __instance.damageOverDistance.Evaluate(Vector3.Distance(position, component2.transform.position)) * (component2.ccm.IsHuman() ? ConfigFile.ServerConfig.GetFloat("human_grenade_multiplier", 0.7f) : ConfigFile.ServerConfig.GetFloat("scp_grenade_multiplier", 1f));
                    if (num2 > __instance.absoluteDamageFalloff)
                    {
                        players.Add(Exiled.API.Features.Player.Get(gameObject));
                    }
                }
            }

            ExplodingGrenadeEventArgs ev = new ExplodingGrenadeEventArgs(players, true, __instance.gameObject);

            Handlers.Map.OnExplodingGrenade(ev);

            return(ev.IsAllowed);
        }
コード例 #5
0
        private static bool Prefix(FlashGrenade __instance)
        {
            List <Exiled.API.Features.Player> players = new List <Exiled.API.Features.Player>();

            foreach (GameObject gameObject in PlayerManager.players)
            {
                Vector3      position = __instance.transform.position;
                ReferenceHub hub      = ReferenceHub.GetHub(gameObject);
                Flashed      effect   = hub.playerEffectsController.GetEffect <Flashed>();
                Deafened     effect2  = hub.playerEffectsController.GetEffect <Deafened>();
                if (effect == null || __instance.thrower == null || (!__instance.Network_friendlyFlash && !effect.Flashable(ReferenceHub.GetHub(__instance.thrower.gameObject), position, __instance.viewLayerMask)))
                {
                    continue;
                }

                float num = __instance.powerOverDistance.Evaluate(Vector3.Distance(gameObject.transform.position, position) / ((position.y > 900f) ? __instance.distanceMultiplierSurface : __instance.distanceMultiplierFacility)) * __instance.powerOverDot.Evaluate(Vector3.Dot(hub.PlayerCameraReference.forward, (hub.PlayerCameraReference.position - position).normalized));
                byte  b   = (byte)Mathf.Clamp(Mathf.RoundToInt(num * 10f * __instance.maximumDuration), 1, 255);
                if (b >= effect.Intensity && num > 0f)
                {
                    players.Add(API.Features.Player.Get(gameObject));
                }
            }

            ExplodingGrenadeEventArgs ev = new ExplodingGrenadeEventArgs(players, false, __instance.gameObject);

            Handlers.Map.OnExplodingGrenade(ev);

            return(ev.IsAllowed);
        }
コード例 #6
0
 private static void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
 {
     if (Methods.IgnoredGrenades.Remove(ev.Grenade.gameObject))
     {
         ev.IsAllowed = false;
     }
 }
コード例 #7
0
 internal void OnExplodeGrenade(ExplodingGrenadeEventArgs ev)
 {
     if (ev.IsFrag)
     {
         if (!config.Grenade.canGrenadeExplode)
         {
             ev.IsAllowed = false;
         }
         if (!config.Grenade.canGrenadeDealDamageGlobal)
         {
             ev.TargetToDamages.Clear();
         }
         else
         {
             foreach (var target in ev.TargetToDamages)
             {
                 if (!config.Grenade.canGrenadeDealDamage[target.Key.Role])
                 {
                     ev.TargetToDamages[target.Key] = 0f;
                 }
             }
         }
     }
     else
     if (!config.Grenade.canFlashGrenadeExplode)
     {
         ev.IsAllowed = false;
     }
 }
コード例 #8
0
        public void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (!TrackingAndMethods.PlayersWithSubclasses.ContainsKey(ev.Thrower) ||
                (!TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].Abilities.Contains(AbilityType.HealGrenadeFlash) &&
                 !TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].Abilities.Contains(AbilityType.HealGrenadeFrag)))
            {
                Log.Debug($"Player with name {ev.Thrower.Nickname} has no subclass", Subclass.Instance.Config.Debug);
                return;
            }
            if (TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].Abilities.Contains(AbilityType.HealGrenadeFlash) && !ev.IsFrag)
            {
                if (!TrackingAndMethods.CanUseAbility(ev.Thrower, AbilityType.HealGrenadeFlash, TrackingAndMethods.PlayersWithSubclasses[ev.Thrower]))
                {
                    TrackingAndMethods.DisplayCantUseAbility(ev.Thrower, AbilityType.HealGrenadeFlash, TrackingAndMethods.PlayersWithSubclasses[ev.Thrower], "heal flash");
                    return;
                }
                TrackingAndMethods.UseAbility(ev.Thrower, AbilityType.HealGrenadeFlash, TrackingAndMethods.PlayersWithSubclasses[ev.Thrower]);
                ev.IsAllowed = false;
                UpdateHealths(ev, "HealGrenadeFlashHealAmount");
            }
            else if (TrackingAndMethods.PlayersWithSubclasses[ev.Thrower].Abilities.Contains(AbilityType.HealGrenadeFrag) && ev.IsFrag)
            {
                if (!TrackingAndMethods.CanUseAbility(ev.Thrower, AbilityType.HealGrenadeFrag, TrackingAndMethods.PlayersWithSubclasses[ev.Thrower]))
                {
                    TrackingAndMethods.DisplayCantUseAbility(ev.Thrower, AbilityType.HealGrenadeFrag, TrackingAndMethods.PlayersWithSubclasses[ev.Thrower], "heal frag");
                    return;
                }
                TrackingAndMethods.UseAbility(ev.Thrower, AbilityType.HealGrenadeFrag, TrackingAndMethods.PlayersWithSubclasses[ev.Thrower]);
                ev.IsAllowed = false;
                UpdateHealths(ev, "HealGrenadeFragHealAmount");
            }

            //if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Thrower))
            //{
            //    foreach (EPlayer target in ev.Targets)
            //    {
            //        if (target.Team != ev.Thrower.Team) continue;
            //        if (Tracking.PlayersWithSubclasses.ContainsKey(ev.Thrower) && Tracking.PlayersWithSubclasses.ContainsKey(target) &&
            //            Tracking.PlayersWithSubclasses[ev.Thrower].AdvancedFFRules.Contains(Tracking.PlayersWithSubclasses[target].Name))
            //        {
            //            target.Hurt(ev.TargetToDamages[target], DamageTypes.Grenade);
            //            continue;
            //        }

            //        if (Tracking.FriendlyFired.Contains(target) || (Tracking.PlayersWithSubclasses.ContainsKey(ev.Thrower) &&
            //            !Tracking.PlayersWithSubclasses[ev.Thrower].BoolOptions["DisregardHasFF"] &&
            //            Tracking.PlayersWithSubclasses[ev.Thrower].BoolOptions["HasFriendlyFire"]) ||
            //            (Tracking.PlayersWithSubclasses.ContainsKey(target) && !Tracking.PlayersWithSubclasses[target].BoolOptions["DisregardTakesFF"] &&
            //            Tracking.PlayersWithSubclasses[target].BoolOptions["TakesFriendlyFire"]))
            //        {
            //            if (!Tracking.FriendlyFired.Contains(target) && !Tracking.PlayersWithSubclasses[target].BoolOptions["TakesFriendlyFire"])
            //                Tracking.AddToFF(ev.Thrower);
            //            target.Hurt(ev.TargetToDamages[target], DamageTypes.Grenade);
            //            //ev.IsAllowed = true;
            //        }
            //    }
            //}
        }
コード例 #9
0
ファイル: EmpGrenade.cs プロジェクト: 4310V343k/CustomItems
        private void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (!Check(ev.Grenade))
            {
                return;
            }

            ev.IsAllowed = false;

            Room room = Exiled.API.Features.Map.FindParentRoom(ev.Grenade);

            Log.Debug($"{ev.Grenade.transform.position} - {room.Position} - {Exiled.API.Features.Map.Rooms.Count}", CustomItems.Instance.Config.IsDebugEnabled);

            LockedRooms079.Add(room);

            room.TurnOffLights(Duration);

            Log.Debug($"{room.Doors.Count()} - {room.Type}", CustomItems.Instance.Config.IsDebugEnabled);

            foreach (DoorVariant door in room.Doors)
            {
                if (door == null ||
                    (!string.IsNullOrEmpty(door.GetNametag()) && BlacklistedDoorNames.Contains(door.GetNametag())) ||
                    (door.NetworkActiveLocks > 0 && !OpenLockedDoors) ||
                    (door.RequiredPermissions.RequiredPermissions != KeycardPermissions.None && !OpenKeycardDoors))
                {
                    continue;
                }

                Log.Debug("Opening a door!", CustomItems.Instance.Config.IsDebugEnabled);

                door.NetworkTargetState = true;
                door.ServerChangeLock(DoorLockReason.NoPower, true);

                if (lockedDoors.Contains(door))
                {
                    lockedDoors.Add(door);
                }

                Timing.CallDelayed(Duration, () =>
                {
                    door.ServerChangeLock(DoorLockReason.NoPower, false);
                    lockedDoors.Remove(door);
                });
            }

            foreach (Player player in Player.Get(RoleType.Scp079))
            {
                if (player.Camera != null && player.Camera.Room() == room)
                {
                    player.SetCamera(198);
                }
            }

            Timing.CallDelayed(Duration, () => LockedRooms079.Remove(room));
        }
コード例 #10
0
        private void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (Check(ev.Grenade))
            {
                Log.Debug($"{ev.Thrower.Nickname} threw an implosion grenade!", CustomItems.Instance.Config.IsDebugEnabled);
                Dictionary <Player, float> copiedList = new Dictionary <Player, float>();
                foreach (KeyValuePair <Player, float> kvp in ev.TargetToDamages)
                {
                    if (kvp.Value > 0)
                    {
                        copiedList.Add(kvp.Key, kvp.Value);
                    }
                }

                ev.TargetToDamages.Clear();
                Log.Debug("IG: List cleared.", CustomItems.Instance.Config.IsDebugEnabled);
                effectedPlayers = NorthwoodLib.Pools.ListPool <Player> .Shared.Rent();

                foreach (Player player in copiedList.Keys)
                {
                    ev.TargetToDamages.Add(player, copiedList[player] * DamageModifier);
                    if (BlacklistedRoles.Contains(player.Role))
                    {
                        continue;
                    }

                    Log.Debug($"{player.Nickname} starting suction", CustomItems.Instance.Config.IsDebugEnabled);

                    try
                    {
                        if (layerMask == 0)
                        {
                            layerMask = ev.Grenade.GetComponent <FragGrenade>().hurtLayerMask;
                        }

                        foreach (Transform grenadePoint in player.ReferenceHub.playerStats.grenadePoints)
                        {
                            bool line = Physics.Linecast(ev.Grenade.transform.position, grenadePoint.position, layerMask);
                            Log.Debug($"{player.Nickname} - {line}", CustomItems.Instance.Config.IsDebugEnabled);
                            if (!line)
                            {
                                effectedPlayers.Add(player);
                                Coroutines.Add(Timing.RunCoroutine(DoSuction(player, ev.Grenade.transform.position + (Vector3.up * 1.5f))));
                                break;
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        Log.Error($"{nameof(OnExplodingGrenade)} error: {exception}");
                    }
                }
            }
        }
コード例 #11
0
        /// <summary>
        /// Trims colliders from the given array.
        /// </summary>
        /// <param name="ev"><inheritdoc cref="ExplodingGrenadeEventArgs"/></param>
        /// <param name="colliderArray">The list of colliders to trim from.</param>
        /// <returns>An array of colliders.</returns>
        public static Collider[] TrimColliders(ExplodingGrenadeEventArgs ev, Collider[] colliderArray)
        {
            List <Collider> colliders = new();

            foreach (Collider collider in colliderArray)
            {
                if (collider.TryGetComponent(out IDestructible dest) &&
                    ReferenceHub.TryGetHubNetID(dest.NetworkId, out ReferenceHub hub) &&
                    Player.Get(hub) is Player player && !ev.TargetsToAffect.Contains(player))
                {
                    colliders.Add(collider);
                }
コード例 #12
0
 public void OnGrenadeExplosion(ExplodingGrenadeEventArgs ev)
 {
     foreach (Player p in ev.TargetToDamages.Keys)
     {
         if (p.IsNPC())
         {
             Npc component = Npc.Get(p);
             if (!component.NPCPlayer.IsGodModeEnabled)
             {
                 p.Hurt(ev.TargetToDamages[p], ev.Thrower, DamageTypes.Grenade);
             }
         }
     }
 }
コード例 #13
0
        /// <inheritdoc/>
        protected override void OnExploding(ExplodingGrenadeEventArgs ev)
        {
            ev.IsAllowed = false;
            Log.Debug($"{ev.Thrower.Nickname} threw an implosion grenade!", CustomItems.Instance.Config.IsDebugEnabled);
            List <Player> copiedList = new List <Player>();

            foreach (Player player in ev.TargetsToAffect)
            {
                copiedList.Add(player);
            }

            ev.TargetsToAffect.Clear();
            Log.Debug("IG: List cleared.", CustomItems.Instance.Config.IsDebugEnabled);
            effectedPlayers = NorthwoodLib.Pools.ListPool <Player> .Shared.Rent();

            foreach (Player player in copiedList)
            {
                if (BlacklistedRoles.Contains(player.Role))
                {
                    continue;
                }

                Log.Debug($"{player.Nickname} starting suction", CustomItems.Instance.Config.IsDebugEnabled);

                try
                {
                    if (layerMask == 0)
                    {
                        if (ev.Grenade is ExplosionGrenade explosionGrenade)
                        {
                            layerMask = explosionGrenade._detectionMask;
                        }
                    }

                    bool line = Physics.Linecast(ev.Grenade.transform.position, player.Position, layerMask);
                    Log.Debug($"{player.Nickname} - {line}", CustomItems.Instance.Config.IsDebugEnabled);
                    if (line)
                    {
                        effectedPlayers.Add(player);
                        Coroutines.Add(Timing.RunCoroutine(DoSuction(player, ev.Grenade.transform.position + (Vector3.up * 1.5f))));
                    }
                }
                catch (Exception exception)
                {
                    Log.Error($"{nameof(OnExploding)} error: {exception}");
                }
            }
        }
コード例 #14
0
        private void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (CheckGrenade(ev.Grenade))
            {
                Log.Debug($"{ev.Thrower.Nickname} threw an implosion grenade!", Plugin.Singleton.Config.Debug);
                Dictionary <Player, float> copiedList = new Dictionary <Player, float>();
                foreach (KeyValuePair <Player, float> kvp in ev.TargetToDamages)
                {
                    if (kvp.Value > 0)
                    {
                        copiedList.Add(kvp.Key, kvp.Value);
                    }
                }

                ev.TargetToDamages.Clear();
                Log.Debug($"IG: List cleared.", Plugin.Singleton.Config.Debug);
                foreach (Player player in copiedList.Keys)
                {
                    ev.TargetToDamages.Add(player, copiedList[player] * Plugin.Singleton.Config.ItemConfigs.ImpCfg.DamageModifier);
                    Log.Debug($"{player.Nickname} starting suction", Plugin.Singleton.Config.Debug);

                    try
                    {
                        if (layerMask == 0)
                        {
                            layerMask = ev.Grenade.GetComponent <FragGrenade>().hurtLayerMask;
                        }

                        foreach (Transform grenadePoint in player.ReferenceHub.playerStats.grenadePoints)
                        {
                            bool line = Physics.Linecast(ev.Grenade.transform.position, grenadePoint.position, layerMask);
                            Log.Debug($"{player.Nickname} - {line}", Plugin.Singleton.Config.Debug);
                            if (!line)
                            {
                                Coroutines.Add(Timing.RunCoroutine(DoSuction(player, ev.Grenade.transform.position + (Vector3.up * 1.5f))));
                                break;
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Error($"REEEE: {e.Message}\n{e.StackTrace}");
                    }
                }
            }
        }
コード例 #15
0
        private void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (CheckGrenade(ev.Grenade))
            {
                ev.IsAllowed = false;

                Room room = Map.FindParentRoom(ev.Grenade);

                room.TurnOffLights(Plugin.Singleton.Config.ItemConfigs.EmpCfg.Duration);
                Log.Debug($"{room.Doors.Count()} - {room.Type}");
                foreach (DoorVariant door in room.Doors)
                {
                    Log.Debug($"Opening a door!", Plugin.Singleton.Config.Debug);
                    door.NetworkTargetState = true;
                    door.ServerChangeLock(DoorLockReason.NoPower, true);

                    Timing.CallDelayed(Plugin.Singleton.Config.ItemConfigs.EmpCfg.Duration, () => door.ServerChangeLock(DoorLockReason.NoPower, false));

                    foreach (Player player in Player.List)
                    {
                        if (player.Role == RoleType.Scp079)
                        {
                            if (player.Camera.Room() == room)
                            {
                                Room homeRoom = Map.Rooms.FirstOrDefault(r => r.Name.Contains("079"));
                                if (homeRoom == null)
                                {
                                    Log.Error($"HAH ROOM IS NULL BITCH");
                                    continue;
                                }

                                player.Camera = homeRoom.GetComponentInParent <Camera079>();
                            }

                            if (!string.IsNullOrEmpty(player.Speaker))
                            {
                                player.Speaker = string.Empty;
                            }

                            break;
                        }
                    }
                }
            }
        }
コード例 #16
0
        internal void ExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (Plugin.Instance.Config.ExplodingGrenade == "")
            {
                return;
            }
            string message = Plugin.Instance.Config.ExplodingGrenade.Replace("%frag%", ev.IsFrag.ToString());
            string targets = string.Join(", ", ev.Targets);

            message = message.Replace("%targets%", targets);


            if (Plugin.Instance.Config.debug_to_console)
            {
                Log.Debug(message: "[ " + Plugin.Instance.Config.map_name + "] " + message);
            }
            Plugin.sendWebHook(Plugin.Instance.Config.map_url, message, Plugin.Instance.Config.map_name);
        }
コード例 #17
0
        private static bool Prefix(FlashGrenade __instance)
        {
            try
            {
                Dictionary <Player, float> players = new Dictionary <Player, float>();

                foreach (GameObject gameObject in PlayerManager.players)
                {
                    Vector3      position = __instance.transform.position;
                    ReferenceHub hub      = ReferenceHub.GetHub(gameObject);
                    Flashed      effect   = hub.playerEffectsController.GetEffect <Flashed>();
                    Deafened     effect2  = hub.playerEffectsController.GetEffect <Deafened>();
                    if (effect == null || __instance.thrower == null ||
                        (!__instance.Network_friendlyFlash && !effect.Flashable(
                             ReferenceHub.GetHub(__instance.thrower.gameObject), position, __instance._ignoredLayers)))
                    {
                        continue;
                    }

                    float num = __instance.powerOverDistance.Evaluate(
                        Vector3.Distance(gameObject.transform.position, position) / ((position.y > 900f)
                                        ? __instance.distanceMultiplierSurface
                                        : __instance.distanceMultiplierFacility)) *
                                __instance.powerOverDot.Evaluate(Vector3.Dot(hub.PlayerCameraReference.forward, (hub.PlayerCameraReference.position - position).normalized));
                    byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(num * 10f * __instance.maximumDuration), 1, 255);
                    if (b >= effect.Intensity && num > 0f)
                    {
                        players.Add(Player.Get(gameObject), num);
                    }
                }

                ExplodingGrenadeEventArgs ev = new ExplodingGrenadeEventArgs(Player.Get(__instance.throwerGameObject), players, false, __instance.gameObject);

                Handlers.Map.OnExplodingGrenade(ev);

                return(ev.IsAllowed);
            }
            catch (Exception exception)
            {
                Log.Error($"{typeof(ExplodingFlashGrenade).FullName}:\n{exception}");

                return(true);
            }
        }
コード例 #18
0
ファイル: Map.cs プロジェクト: JasKill/AdvancedSubclassing
 public void UpdateHealths(ExplodingGrenadeEventArgs ev, string type)
 {
     UnityEngine.Collider[] colliders = UnityEngine.Physics.OverlapSphere(ev.Grenade.transform.position, 4);
     foreach (UnityEngine.Collider collider in colliders.Where(c => c.name == "Player"))
     {
         EPlayer player = EPlayer.Get(collider.gameObject);
         if (player != null && player.Team == ev.Thrower.Team)
         {
             try
             {
                 player.Health += Tracking.PlayersWithSubclasses[ev.Thrower].FloatOptions[type];
             }
             catch (KeyNotFoundException e)
             {
                 player.Health = player.MaxHealth;
             }
         }
     }
 }
コード例 #19
0
ファイル: EmpGrenade.cs プロジェクト: Michal78900/CustomItems
        /// <inheritdoc/>
        protected override void OnExploding(ExplodingGrenadeEventArgs ev)
        {
            ev.IsAllowed = false;
            Room      room = Exiled.API.Features.Map.FindParentRoom(ev.Grenade.gameObject);
            TeslaGate gate = null;

            Log.Debug($"{ev.Grenade.transform.position} - {room.Position} - {Room.List.Count()}", CustomItems.Instance.Config.IsDebugEnabled);

            LockedRooms079.Add(room);

            room.TurnOffLights(Duration);

            if (DisableTeslaGates)
            {
                foreach (TeslaGate teslaGate in TeslaGate.List)
                {
                    if (Exiled.API.Features.Map.FindParentRoom(teslaGate.GameObject) == room)
                    {
                        disabledTeslaGates.Add(teslaGate);
                        gate = teslaGate;
                        break;
                    }
                }
            }

            Log.Debug($"{room.Doors.Count()} - {room.Type}", CustomItems.Instance.Config.IsDebugEnabled);

            foreach (Door door in room.Doors)
            {
                if (door == null ||
                    (!string.IsNullOrEmpty(door.Nametag) && BlacklistedDoorNames.Contains(door.Nametag)) ||
                    (door.DoorLockType > 0 && !OpenLockedDoors) ||
                    (door.RequiredPermissions.RequiredPermissions != KeycardPermissions.None && !OpenKeycardDoors))
                {
                    continue;
                }

                Log.Debug("Opening a door!", CustomItems.Instance.Config.IsDebugEnabled);

                door.IsOpen = true;
                door.ChangeLock(DoorLockType.NoPower);

                if (!lockedDoors.Contains(door))
                {
                    lockedDoors.Add(door);
                }

                Timing.CallDelayed(Duration, () =>
                {
                    door.Unlock();
                    lockedDoors.Remove(door);
                });
            }

            foreach (Player player in Player.List)
            {
                if (player.Role.As <Scp079Role>() is Scp079Role scp079)
                {
                    if (scp079.Camera != null && scp079.Camera.Room == room)
                    {
                        scp079.SetCamera(198);
                    }
                }

                if (player.CurrentRoom != room)
                {
                    continue;
                }

                foreach (Item item in player.Items)
                {
                    switch (item)
                    {
                    case Radio radio:
                        radio.Disable();
                        break;

                    case Flashlight flashlight:
                        flashlight.Active = false;
                        break;

                    case Firearm firearm:
                    {
                        foreach (FirearmAttachment attachment in firearm.Attachments)
                        {
                            if (attachment.Name == AttachmentNameTranslation.Flashlight)
                            {
                                attachment.IsEnabled = false;
                            }
                        }
                        break;
                    }
                    }
                }
            }

            Timing.CallDelayed(Duration, () =>
            {
                try
                {
                    LockedRooms079.Remove(room);
                }
                catch (Exception e)
                {
                    Log.Debug($"REMOVING LOCKED ROOM: {e}");
                }

                if (gate != null)
                {
                    try
                    {
                        disabledTeslaGates.Remove(gate);
                    }
                    catch (Exception e)
                    {
                        Log.Debug($"REMOVING DISABLED TESLA: {e}");
                    }
                }
            });
        }
コード例 #20
0
ファイル: Map.cs プロジェクト: helightdev/EXILED
 /// <summary>
 /// Called before a grenade explodes.
 /// </summary>
 /// <param name="ev">The <see cref="ExplodingGrenadeEventArgs"/> instance.</param>
 public static void OnExplodingGrenade(ExplodingGrenadeEventArgs ev) => ExplodingGrenade.InvokeSafely(ev);
コード例 #21
0
ファイル: Map.cs プロジェクト: zabszk/EXILED
 /// <inheritdoc cref="Events.Handlers.Map.OnExplodingGrenade(ExplodingGrenadeEventArgs)"/>
 public void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
 {
     Log.Info($"A frag grenade thrown by {ev.Thrower.Nickname} is exploding: {ev.Grenade.name}\n[Targets]\n\n{string.Join("\n", ev.TargetToDamages.Select(player => $"[{player.Key.Nickname} ({player.Value} HP)]"))}");
 }
コード例 #22
0
ファイル: MapHandler.cs プロジェクト: xRoier/EXILED
 /// <inheritdoc cref="Exiled.Events.Handlers.Map.OnExplodingGrenade(ExplodingGrenadeEventArgs)"/>
 public void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
 {
     Log.Info($"A grenade thrown by {ev.Thrower.Nickname} is exploding: {ev.Grenade.name}\n[Targets]\n\n{string.Join("\n", ev.TargetsToAffect.Select(player => $"[{player.Nickname}]"))}");
 }
コード例 #23
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);
        }
コード例 #24
0
 /// <inheritdoc/>
 protected override void OnExploding(ExplodingGrenadeEventArgs ev)
 {
     PlacedCharges.Remove(Pickup.Get(ev.Grenade));
 }
コード例 #25
0
        private void OnExplodingGrenade(ExplodingGrenadeEventArgs ev)
        {
            if (!Check(ev.Grenade))
            {
                return;
            }

            ev.IsAllowed = false;

            Room      room = Exiled.API.Features.Map.FindParentRoom(ev.Grenade);
            TeslaGate gate = null;

            Log.Debug($"{ev.Grenade.transform.position} - {room.Position} - {Exiled.API.Features.Map.Rooms.Count}", CustomItems.Instance.Config.IsDebugEnabled);

            LockedRooms079.Add(room);

            room.TurnOffLights(Duration);

            if (DisableTeslaGates)
            {
                foreach (TeslaGate teslaGate in Exiled.API.Features.Map.TeslaGates)
                {
                    if (Exiled.API.Features.Map.FindParentRoom(teslaGate.gameObject) == room)
                    {
                        disabledTeslaGates.Add(teslaGate);
                        gate = teslaGate;
                        break;
                    }
                }
            }

            Log.Debug($"{room.Doors.Count()} - {room.Type}", CustomItems.Instance.Config.IsDebugEnabled);

            foreach (DoorVariant door in room.Doors)
            {
                if (door == null ||
                    (!string.IsNullOrEmpty(door.GetNametag()) && BlacklistedDoorNames.Contains(door.GetNametag())) ||
                    (door.NetworkActiveLocks > 0 && !OpenLockedDoors) ||
                    (door.RequiredPermissions.RequiredPermissions != KeycardPermissions.None && !OpenKeycardDoors))
                {
                    continue;
                }

                Log.Debug("Opening a door!", CustomItems.Instance.Config.IsDebugEnabled);

                door.NetworkTargetState = true;
                door.ServerChangeLock(DoorLockReason.NoPower, true);

                if (lockedDoors.Contains(door))
                {
                    lockedDoors.Add(door);
                }

                Timing.CallDelayed(Duration, () =>
                {
                    door.ServerChangeLock(DoorLockReason.NoPower, false);
                    lockedDoors.Remove(door);
                });
            }

            foreach (Player player in Player.List)
            {
                if (player.Role == RoleType.Scp079)
                {
                    if (player.Camera != null && player.Camera.Room() == room)
                    {
                        player.SetCamera(198);
                    }
                }
                if (player.CurrentRoom != room)
                {
                    continue;
                }

                foreach (Inventory.SyncItemInfo item in player.ReferenceHub.inventory.items)
                {
                    if (item.id == ItemType.Radio)
                    {
                        player.ReferenceHub.inventory.items.ModifyDuration(player.ReferenceHub.GetComponent <Radio>().myRadio, 0f);
                    }
                    else if (player.ReferenceHub.weaponManager.syncFlash)
                    {
                        player.ReferenceHub.weaponManager.syncFlash = false;
                    }
                }
            }

            Timing.CallDelayed(Duration, () =>
            {
                LockedRooms079.Remove(room);
                if (gate != null)
                {
                    disabledTeslaGates.Remove(gate);
                }
            });
        }