/// <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;
 }
Beispiel #2
0
        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);
            }
        }