public static Vector3 FindSpawnPosition(Player ply, DamageHandler info) { if (ply.Role == RoleType.Scp106 && info.Type == DamageType.Recontainment) { if (PlayerMovementSync.FindSafePosition(ply.Position, out Vector3 safePos)) { return(safePos); } else { return(ply.Position + new Vector3(0, 5, 0)); } } else if (ply.CurrentRoom.Type == RoomType.Pocket) { return(new Vector3(0, -1998.67f, 2)); } else if (ply.Role == RoleType.Spectator || ply.Role == RoleType.None) { return(new Vector3(0, 1001, 8)); } else { return(ply.Position); } }
private static void OnSpawning(SpawningEventArgs ev) { if (!(Scp457.Get(ev.Player) is Scp457 scp457)) { return; } if (ev.RoleType != RoleType.Scp0492) { scp457.Destroy(); return; } Door door = Map.GetDoorByName(Plugin.Instance.Config.Scp457Settings.SpawnDoor); if (door == null) { Log.Error("Could not find the spawn door for Scp457!"); return; } if (PlayerMovementSync.FindSafePosition(door.Base.transform.position, out Vector3 pos, true)) { ev.Position = pos; } }
public static void Run(List <string> args, int i) { if (args.Count < 1) { throw new InvalidArgumentLengthException("Expected 1 argument but got 0 for command \"teleport\" at line " + i + "."); } if (args.Count < 4) { var roleInfo = RoleInfo.parseRole(args[0], "teleport", i, 0); var door = UnityEngine.Object.FindObjectsOfType <DoorNametagExtension>().FirstOrDefault(_door => _door.GetName.Trim().ToUpper() == args[1].Trim().ToUpper()); if (door == null) { throw new InvalidArgumentException("Invalid argument for command \"teleport\" on line " + i + ", argument 1. The door name specified is not valid."); } if (!PlayerMovementSync.FindSafePosition(door.transform.position, out var pos)) { throw new CommandErrorException("No safe position could be found for door \"" + door.name + "\"."); } if (args.Count == 3) { if (!int.TryParse(args[2].Trim(), out var delay)) { throw new InvalidArgumentException("Invalid argument for command \"teleport\" on line " + i + ", argument 2. Expected \"INT\" but got \"" + args[2] + "\"."); } ScriptActions.GetDelay(delay).teleportIds.Add(new TeleportData(pos, roleInfo)); } else { ScriptActions.scriptData.teleportIds.Add(new TeleportData(pos, roleInfo)); } } else { var roleInfo = RoleInfo.parseRole(args[0], "teleport", i, 0); if (!int.TryParse(args[1].Trim(), out var x)) { throw new InvalidArgumentException("Invalid argument for command \"teleport\" on line " + i + ", argument 1. Expected \"INT\" but got \"" + args[1] + "\"."); } if (!int.TryParse(args[2].Trim(), out var y)) { throw new InvalidArgumentException("Invalid argument for command \"teleport\" on line " + i + ", argument 2. Expected \"INT\" but got \"" + args[2] + "\"."); } if (!int.TryParse(args[3].Trim(), out var z)) { throw new InvalidArgumentException("Invalid argument for command \"teleport\" on line " + i + ", argument 3. Expected \"INT\" but got \"" + args[3] + "\"."); } if (args.Count == 5) { if (!int.TryParse(args[4].Trim(), out var delay)) { throw new InvalidArgumentException("Invalid argument for command \"teleport\" on line " + i + ", argument 2. Expected \"INT\" but got \"" + args[2] + "\"."); } ScriptActions.GetDelay(delay).teleportIds.Add(new TeleportData(new Vector3(x, y, z), roleInfo)); } else { ScriptActions.scriptData.teleportIds.Add(new TeleportData(new Vector3(x, y, z), roleInfo)); } } }
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); } }