/// <summary> /// Initializes a new instance of the <see cref="EscapingPocketDimensionEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="Player"/></param> /// <param name="position"><inheritdoc cref="TeleportPosition"/></param> /// <param name="num1">Distance number 1.</param> /// <param name="num2">Distance number 2.</param> public EscapingPocketDimensionEventArgs(Player player, SafeTeleportPosition position, float num1, float num2) { Player = player; TeleportPosition = num1 < num2 ? position.SafePositions[0].position : position.SafePositions[1].position; }
private static bool TriggerEnter(PocketDimensionTeleport __instance, Collider other) { try { var component = other.GetComponent <NetworkIdentity>(); if (component == null) { return(false); } var type = __instance._type; var player = component.GetPlayer(); var pos = Vector3.zero; if (player == null) { return(false); } var forceEscape = !SynapseExtensions.CanHarmScp(player, false); if (player.Hub.scp106PlayerScript.GrabbedPosition == Vector3.zero) { player.Hub.scp106PlayerScript.GrabbedPosition = new Vector3(0f, -1997f, 0f); } var identifier = MapGeneration.RoomIdUtils.RoomAtPosition(player.Hub.scp106PlayerScript.GrabbedPosition); if (identifier.Zone == FacilityZone.Surface) { foreach (var player2 in Server.Get.Players) { if (player2.RoleType == RoleType.Scp106) { Vector3 objPos = (player2 == null) ? Vector3.zero : player2.PlayerMovementSync.RealModelPosition; SafeTeleportPosition componentInChildren = identifier.GetComponentInChildren <SafeTeleportPosition>(); float num = Vector3.Distance(objPos, componentInChildren.SafePositions[0].position); float num2 = Vector3.Distance(objPos, componentInChildren.SafePositions[1].position); pos = (num2 < num) ? componentInChildren.SafePositions[0].position : componentInChildren.SafePositions[1].position; break; } } } else { var hashSet = MapGeneration.RoomIdUtils.FindRooms(MapGeneration.RoomName.Unnamed, identifier.Zone, MapGeneration.RoomShape.Undefined); /*hashSet.RemoveWhere((MapGeneration.RoomIdentifier room) => * room.Name == MapGeneration.RoomName.Hcz106 || room.Name == MapGeneration.RoomName.EzGateA || * room.Name == MapGeneration.RoomName.EzGateB || room.Name == MapGeneration.RoomName.EzEvacShelter || * (room.Zone == MapGeneration.FacilityZone.LightContainment && room.Shape == MapGeneration.RoomShape.Curve) || * room.Zone == MapGeneration.FacilityZone.None || room.Name == MapGeneration.RoomName.Pocket || * room.Name == MapGeneration.RoomName.HczTesla);*/ try { while (hashSet.Count > 0) { MapGeneration.RoomIdentifier roomIdentifier2 = hashSet.ElementAt(UnityEngine.Random.Range(0, hashSet.Count)); var safepos = roomIdentifier2.transform.position; var safeTeleport = roomIdentifier2.GetComponentInChildren <SafeTeleportPosition>(); if (safeTeleport != null && safeTeleport.SafePositions?.Length != 0) { safepos = safeTeleport.SafePositions[UnityEngine.Random.Range(0, safeTeleport.SafePositions.Length)].position; } if (PlayerMovementSync.FindSafePosition(safepos, out pos, false, true)) { break; } hashSet.Remove(roomIdentifier2); } } catch (Exception ex) { //I don't know how but for some Reason this fails sometimes and the method is called a second time //Logger.Get.Debug(ex); return(false); } } EventHandler.Get.Scp.Scp106.InvokePocketDimensionLeaveEvent(player, ref pos, ref type, out var allow); if (!allow) { return(false); } if (!forceEscape && (type == PocketDimensionTeleport.PDTeleportType.Killer || Synapse.Api.Nuke.Get.Detonated)) { player.PlayerStats.DealDamage(new UniversalDamageHandler(-1f, DeathTranslations.PocketDecay)); return(false); } else { player.Position = pos; player.PlayerEffectsController.EnableEffect <CustomPlayerEffects.Disabled>(10f, true); player.PlayerEffectsController.GetEffect <CustomPlayerEffects.Corroding>().Intensity = 0; Achievements.AchievementHandlerBase.ServerAchieve(component.connectionToClient, AchievementName.LarryFriend); } MapGeneration.ImageGenerator.pocketDimensionGenerator.GenerateRandom(); return(false); } catch (Exception e) { Logger.Get.Error($"Synapse-Event: PocketDimLeave failed!!\n{e}"); return(true); } }