Exemplo n.º 1
0
        private static bool Prefix(Scp096 __instance)
        {
            if (__instance._flash.Enabled)
            {
                return(false);
            }
            Exiled.API.Features.Player scp096 = Exiled.API.Features.Player.Get(__instance.Hub);
            if (scp096.IsNPC() && !NPCS.Npc.Dictionary[__instance.Hub.gameObject].ProcessSCPLogic)
            {
                return(false);
            }
            Vector3 vector = __instance.Hub.transform.TransformPoint(Scp096._headOffset);

            foreach (System.Collections.Generic.KeyValuePair <GameObject, global::ReferenceHub> keyValuePair in global::ReferenceHub.GetAllHubs())
            {
                global::ReferenceHub          value = keyValuePair.Value;
                global::CharacterClassManager characterClassManager = value.characterClassManager;
                NPCS.Npc npc = NPCS.Npc.Dictionary.ContainsKey(keyValuePair.Key) ? NPCS.Npc.Dictionary[keyValuePair.Key] : null;
                if (characterClassManager.CurClass != global::RoleType.Spectator && !(value == __instance.Hub) && !characterClassManager.IsAnyScp() && Vector3.Dot((value.PlayerCameraReference.position - vector).normalized, __instance.Hub.PlayerCameraReference.forward) >= 0.1f && (npc == null || npc.ShouldTrigger096))
                {
                    VisionInformation visionInformation = VisionInformation.GetVisionInformation(value, vector, -0.1f, 60f, true, true, __instance.Hub.localCurrentRoomEffects);
                    if (visionInformation.IsLooking)
                    {
                        float delay = visionInformation.LookingAmount / 0.25f * (visionInformation.Distance * 0.1f);
                        if (!__instance.Calming)
                        {
                            __instance.AddTarget(value.gameObject);
                        }
                        if (__instance.CanEnrage && value.gameObject != null)
                        {
                            __instance.PreWindup(delay);
                        }
                    }
                }
            }
            return(false);
        }
        public static bool Prefix(SinkholeEnvironmentalHazard __instance, ReferenceHub player)
        {
            // Check if player has a connection to the server.
            if (!NetworkServer.active)
            {
                return(false);
            }

            if (player.playerEffectsController == null)
            {
                return(false);
            }

            global::PlayerEffectsController playerEffectsController = player.playerEffectsController;

            // Check if the player walking into a sinkhole is an SCP or not.
            if (__instance.SCPImmune)
            {
                global::CharacterClassManager characterClassManager = player.characterClassManager;
                if (characterClassManager == null || characterClassManager.IsAnyScp())
                {
                    return(false);
                }
            }

            /* Check if player is in god mode.
             * Player ply = Player.Get(player);
             * if (ply.IsGodModeEnabled) return false; */

            // If a player is out of a sinkhole's range.
            if ((double)Vector3.Distance(player.playerMovementSync.RealModelPosition, __instance.transform.position) > (double)__instance.DistanceToBeAffected * BetterSinkholes2.config.SlowDistance)
            {
                // If player doesn't have a sinkhole effect don't remove it.
                if (player.TryGetComponent <PlayerEffectsController>(out PlayerEffectsController pec))
                {
                    CustomPlayerEffects.SinkHole SinkholeEffect = pec.GetEffect <CustomPlayerEffects.SinkHole>();

                    // // If the player has the sinkhole effect, remove it.
                    if (SinkholeEffect != null && SinkholeEffect.enabled)
                    {
                        playerEffectsController.DisableEffect <CustomPlayerEffects.SinkHole>();
                    }

                    return(false);
                }

                return(false);
            }

            // Check distance from the sinkhole's center.
            if ((double)Vector3.Distance(player.playerMovementSync.RealModelPosition, __instance.transform.position) < (double)__instance.DistanceToBeAffected * BetterSinkholes2.config.TeleportDistance)
            {
                // Remove Sinkhole effect once falling into a sinkhole.
                playerEffectsController.DisableEffect <CustomPlayerEffects.SinkHole>();

                // Teleport player once walking too close to the center of a sinkhole.
                player.playerMovementSync.OverridePosition(Vector3.down * 1998.5f, 0f, true);

                // Apply corrosion effect.
                playerEffectsController.EnableEffect <CustomPlayerEffects.Corroding>(0f, false);

                // Send player a broadcast specified in the configs. Default: "" for 0U duration.
                QueryProcessor.Localplayer.GetComponent <Broadcast>().TargetAddElement(player.gameObject.GetComponent <NetworkIdentity>().connectionToClient, BetterSinkholes2.translation.TeleportMessage, BetterSinkholes2.config.TeleportMessageDuration, Broadcast.BroadcastFlags.Normal);
                return(false);
            }

            playerEffectsController.EnableEffect <CustomPlayerEffects.SinkHole>(0f, false);
            return(false);
        }