Example #1
0
        private static bool DistanceChanged(SinkholeEnvironmentalHazard __instance, ReferenceHub player)
        {
            try
            {
                var synapseplayer = player.GetPlayer();

                if (Vector3.Distance(synapseplayer.Position, __instance.transform.position) <= __instance.DistanceToBeAffected)
                {
                    var allow = true;
                    if (__instance.SCPImmune && !SynapseExtensions.CanHarmScp(synapseplayer, false) || synapseplayer.GodMode)
                    {
                        allow = false;
                    }

                    Synapse.Api.Events.EventHandler.Get.Player.InvokeSinkhole(synapseplayer, __instance, ref allow);

                    if (allow)
                    {
                        synapseplayer.GiveEffect(Api.Enum.Effect.SinkHole);
                        return(false);
                    }
                }

                synapseplayer.GiveEffect(Api.Enum.Effect.SinkHole, 0);

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerWalkOnSinkholeEvent failed!!\n{e}");
                return(true);
            }
        }
Example #2
0
        internal void InvokeSinkhole(Player player, SinkholeEnvironmentalHazard sinkhole, ref bool allow)
        {
            var ev = new PlayerWalkOnSinkholeEventArgs
            {
                SlowDown = allow,
                Player   = player,
                Sinkhole = sinkhole
            };

            PlayerWalkOnSinkholeEvent?.Invoke(ev);

            allow = ev.SlowDown;
        }
        private static bool Prefix(SinkholeEnvironmentalHazard __instance, GameObject player)
        {
            try
            {
                if (!NetworkServer.active)
                {
                    return(false);
                }

                var component = player?.GetComponentInParent <PlayerEffectsController>();
                if (component == null)
                {
                    return(false);
                }

                var sinkholeeffect = component.GetEffect <CustomPlayerEffects.SinkHole>();
                var synapseplayer  = player.GetPlayer();

                if (Vector3.Distance(player.transform.position, __instance.transform.position) <= __instance.DistanceToBeAffected)
                {
                    var allow = true;
                    if (__instance.SCPImmune && synapseplayer.RealTeam == Team.SCP || synapseplayer.GodMode)
                    {
                        allow = false;
                    }

                    Synapse.Api.Events.EventHandler.Get.Player.InvokeSinkhole(synapseplayer, __instance, ref allow);

                    if (allow)
                    {
                        synapseplayer.GiveEffect(Api.Enum.Effect.SinkHole);
                        return(false);
                    }
                }

                synapseplayer.GiveEffect(Api.Enum.Effect.SinkHole, 0);

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerWalkOnSinkholeEvent failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                return(true);
            }
        }
Example #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="WalkingOnSinkholeEventArgs"/> class.
 /// </summary>
 /// <param name="player"><inheritdoc cref="Player"/></param>
 /// <param name="sinkhole"><inheritdoc cref="SinkholeEnvironmentalHazard"/></param>
 /// <param name="isAllowed"><inheritdoc cref="IsAllowed"/></param>
 public WalkingOnSinkholeEventArgs(Player player, SinkholeEnvironmentalHazard sinkhole, bool isAllowed = true)
 {
     Player    = player;
     Sinkhole  = sinkhole;
     IsAllowed = isAllowed;
 }
        public static bool Prefix(SinkholeEnvironmentalHazard __instance, GameObject player)
        {
            // Check if player has a connection to the server.
            if (!NetworkServer.active)
            {
                return(false);
            }

            PlayerEffectsController componentInParent = player.GetComponentInParent <PlayerEffectsController>();

            if (componentInParent == null)
            {
                return(false);
            }

            componentInParent.GetEffect <CustomPlayerEffects.SinkHole>();

            // Check if the player walking into a sinkhole is an SCP or not.
            if (__instance.SCPImmune)
            {
                CharacterClassManager component = player.GetComponent <CharacterClassManager>();
                if (component == null || component.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 (Vector3.Distance(player.transform.position, __instance.transform.position) > (double)__instance.DistanceToBeAffected * BetterSinkholes.config.SlowDistance)
            {
                // If player doesn't have a sinkhole effect don't remove it.
                if (player.TryGetComponent(out PlayerEffectsController pec))
                {
                    CustomPlayerEffects.SinkHole SinkholeEffect = pec.GetEffect <CustomPlayerEffects.SinkHole>();

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

                    return(false);
                }

                return(false);
            }

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

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

                // Apply corrosion effect.
                PlayerEffectsController playerEffectsController = referenceHub.playerEffectsController;
                playerEffectsController.GetEffect <CustomPlayerEffects.Corroding>().IsInPd = true;
                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, BetterSinkholes.config.TeleportMessage, BetterSinkholes.config.TeleportMessageDuration, Broadcast.BroadcastFlags.Normal);
                return(false);
            }

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