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); } }
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); } }
/// <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); }