/// <summary> /// Initializes a new instance of the <see cref="ChangingCameraEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="Player"/></param> /// <param name="camera"><inheritdoc cref="Camera"/></param> /// <param name="auxiliaryPowerCost"><inheritdoc cref="AuxiliaryPowerCost"/></param> /// <param name="isAllowed"><inheritdoc cref="IsAllowed"/></param> public ChangingCameraEventArgs(Player player, Camera079 camera, float auxiliaryPowerCost, bool isAllowed = true) { Player = player; Camera = API.Features.Camera.Get(camera); AuxiliaryPowerCost = auxiliaryPowerCost; IsAllowed = isAllowed; }
/// <summary> /// Initializes a new instance of the <see cref="ElevatorTeleportEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="Player"/></param> /// <param name="camera"><inheritdoc cref="Camera"/></param> /// <param name="apCost"><inheritdoc cref="APCost"/></param> /// <param name="isAllowed"><inheritdoc cref="IsAllowed"/></param> public ElevatorTeleportEventArgs(Player player, Camera079 camera, float apCost, bool isAllowed = true) { Player = player; Camera = camera; APCost = apCost; IsAllowed = isAllowed; }
/// <summary> /// Gets all the <see cref="CameraType"/> and <see cref="Room"/> values for for the <see cref="Camera079"/> instances using <see cref="Camera079.cameraId"/> and <see cref="UnityEngine.GameObject"/> name. /// </summary> internal static void RegisterCameraInfoOnLevelLoad() { OrderedCameraTypes.Clear(); ReadOnlyCollection <Camera079> cameras = Map.Cameras; int cameraCount = cameras.Count; for (int i = 0; i < cameraCount; i++) { Camera079 camera = cameras[i]; int cameraID = camera.GetInstanceID(); CameraType cameraType = (CameraType)cameraID; Room room = Map.FindParentRoom(camera.gameObject); if (OrderedCameraTypes.ContainsKey(cameraID)) { OrderedCameraTypes.Remove(cameraID); } if (OrderedCameraRooms.ContainsKey(cameraID)) { OrderedCameraRooms.Remove(cameraID); } OrderedCameraTypes.Add(cameraID, cameraType); OrderedCameraRooms.Add(cameraID, room); } }
/// <summary> /// Initializes a new instance of the <see cref="ChangingCameraEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="Player"/></param> /// <param name="camera"><inheritdoc cref="Camera"/></param> /// <param name="auxiliaryPowerCost"><inheritdoc cref="AuxiliaryPowerCost"/></param> /// <param name="isAllowed"><inheritdoc cref="IsAllowed"/></param> public ChangingCameraEventArgs(Player player, Camera079 camera, float auxiliaryPowerCost, bool isAllowed = true) { Player = player; Camera = camera; AuxiliaryPowerCost = auxiliaryPowerCost; IsAllowed = isAllowed; }
/// <summary> /// Initializes a new instance of the <see cref="ElevatorTeleportingEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="Player"/></param> /// <param name="camera"><inheritdoc cref="Camera"/></param> /// <param name="auxiliaryPowerCost"><inheritdoc cref="AuxiliaryPowerCost"/></param> /// <param name="isAllowed"><inheritdoc cref="IsAllowed"/></param> public ElevatorTeleportingEventArgs(Player player, Camera079 camera, float auxiliaryPowerCost, bool isAllowed = true) { Player = player; Camera = camera; AuxiliaryPowerCost = auxiliaryPowerCost; IsAllowed = isAllowed; }
/// <summary> /// Initializes a new instance of the <see cref="ChangingCameraEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="Player"/></param> /// <param name="newCamera"><inheritdoc cref="Camera"/></param> /// <param name="manaCost"><inheritdoc cref="APCost"/></param> /// <param name="isAllowed"><inheritdoc cref="IsAllowed"/></param> public ChangingCameraEventArgs(Player player, Camera079 newCamera, float manaCost, bool isAllowed = true) { Player = player; Camera = newCamera; APCost = manaCost; IsAllowed = isAllowed; }
private static List <Camera079> FindCameras(GameObject gameObject) { List <Camera079> cameraList = new List <Camera079>(); foreach (Scp079Interactable scp079Interactable in Interface079.singleton.allInteractables) { foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interactable.currentZonesAndRooms) { if (zoneAndRoom.currentRoom != gameObject.name || zoneAndRoom.currentZone != gameObject.transform.parent.name) { continue; } if (scp079Interactable.type != Scp079Interactable.InteractableType.Camera) { continue; } Camera079 camera079 = scp079Interactable.GetComponent <Camera079>(); if (!cameraList.Contains(camera079)) { cameraList.Add(camera079); } } } return(cameraList); }
public static bool CanLookToPlayer(this Camera079 camera, Player player) { if (player.Role == RoleType.Spectator || player.Role == RoleType.Scp079 || player.Role == RoleType.None) { return(false); } float num = Vector3.Dot(camera.head.transform.forward, player.Position - camera.transform.position); return((num >= 0f && num * num / (player.Position - camera.transform.position).sqrMagnitude > 0.4225f) && Physics.Raycast(camera.transform.position, player.Position - camera.transform.position, out RaycastHit raycastHit, 100f, -117407543) && raycastHit.transform.name == player.GameObject.name); }
private static bool Prefix(Scp079PlayerScript __instance, ushort cameraId, bool lookatRotation) { try { if (!__instance._interactRateLimit.CanExecute(true)) { return(false); } if (!__instance.iAm079) { return(false); } Camera079 camera = API.Features.Map.GetCameraById(cameraId); if (camera == null) { return(false); } float num = __instance.CalculateCameraSwitchCost(camera.transform.position); bool isAllowed = num <= __instance.curMana; ChangingCameraEventArgs ev = new ChangingCameraEventArgs(API.Features.Player.Get(__instance.gameObject), camera, num, isAllowed); Scp079.OnChangingCamera(ev); if (ev.IsAllowed) { __instance.RpcSwitchCamera(ev.Camera.cameraId, lookatRotation); __instance.Mana = Mathf.Clamp(__instance.Mana - ev.APCost, 0, __instance.maxMana); __instance.currentCamera = ev.Camera; } else if (ev.APCost > __instance.curMana) { __instance.RpcNotEnoughMana(ev.APCost, __instance.curMana); } return(false); } catch (Exception e) { Exiled.API.Features.Log.Error($"{typeof(ChangingCamera).FullName}.{nameof(Prefix)}:\n{e}"); return(true); } }
private void Check079Spot() { if (!SanyaPlugin.Instance.Config.Scp079ScanRoom || player.Role != RoleType.Scp079 || player.CurrentRoom == null || player.Camera == _lastcam) { return; } string message = string.Empty; if (player.CurrentRoom.GetComponentsInChildren <Scp079Generator>().Any(x => x.Activating)) { message = $"<color=#bbee00><size=25>発電機が起動を開始している\n場所:{player.CurrentRoom.Type}</color></size>\n"; } else { var target = player.CurrentRoom.Players.FirstOrDefault(x => x.Team != Team.SCP && x.Team != Team.RIP && x.Team != Team.CHI); if (target != null) { if (player.CurrentRoom.Zone == Exiled.API.Enums.ZoneType.Surface) { message = $"<color=#bbee00><size=25>SCP-079が{target.ReferenceHub.characterClassManager.CurRole.fullName}を発見した\n場所:{Methods.TranslateZoneName(player.CurrentRoom.Zone)}</color></size>\n"; } else { message = $"<color=#bbee00><size=25>SCP-079が{target.ReferenceHub.characterClassManager.CurRole.fullName}を発見した\n場所:{Methods.TranslateZoneName(player.CurrentRoom.Zone)}の{Methods.TranslateRoomName(player.CurrentRoom.Type)}</color></size>\n"; } } } if (!string.IsNullOrEmpty(message)) { foreach (var scp in Player.Get(Team.SCP)) { scp.ReferenceHub.GetComponent <SanyaPluginComponent>().AddHudCenterDownText(message, 5); } } _lastcam = player.Camera; }
public bool Execute(ArraySegment <string> arguments, ICommandSender sender, out string response) { if (sender is PlayerCommandSender) { var plr = sender as PlayerCommandSender; if (plr.RH.characterClassManager.NetworkCurClass == RoleType.Scp079) { var plugin = Better079Plugin.instance; var args = arguments.Array; { if (args.Length == 1) { if (args[1].ToLower().Equals("help") || args[1].ToLower().Equals("commands") || args[1].ToLower().Equals("?")) { response = plugin.Config.b079_help_title + "\n" + "\"." + plugin.Config.b079_prefix + " a1\" - " + plugin.Config.b079_help_a1 + " - " + plugin.Config.b079_a1_power + "+ AP - Tier " + (plugin.Config.b079_a1_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a2\" - " + plugin.Config.b079_help_a2 + " - " + plugin.Config.b079_a2_power + "+ AP - Tier " + (plugin.Config.b079_a2_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a3\" - " + plugin.Config.b079_help_a3 + " - " + plugin.Config.b079_a3_power + "+ AP - Tier " + (plugin.Config.b079_a3_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a4\" - " + plugin.Config.b079_help_a4 + " - " + plugin.Config.b079_a4_power + "+ AP - Tier " + (plugin.Config.b079_a4_tier + 1) + "+\n"; return(true); } if (args[1].ToLower().Equals("a1")) { if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a1_tier) { response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a1_tier + 1)); return(true); } if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a1_power) { plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a1_power; } else { response = plugin.Config.b079_msg_no_power; return(true); } var cams = PluginEvents.GetSCPCameras(); if (cams.Count > 0) { Camera079 cam = cams[UnityEngine.Random.Range(0, cams.Count)]; plr.RH.scp079PlayerScript.CmdSwitchCamera(cam.cameraId, false); response = plugin.Config.b079_msg_a1_run; return(true); } else { plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a1_power; response = plugin.Config.b079_msg_a1_fail; return(true); } } if (args[1].ToLower().Equals("a2")) { if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a2_tier) { response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a2_tier + 1)); return(true); } if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a2_power) { plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a2_power; } else { response = plugin.Config.b079_msg_no_power; return(true); } if (Time.timeSinceLevelLoad - PluginEvents.a2cooldown < plugin.Config.b079_a2_cooldown) { plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; response = plugin.Config.b079_msg_a2_fail; return(true); } Room room = PluginEvents.SCP079Room(plr.RH); if (room == null) { plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; response = plugin.Config.b079_msg_a2_fail; return(true); } if (room.Zone == ZoneType.Surface) { plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; response = plugin.Config.b079_msg_a2_fail; return(true); } foreach (var item in plugin.Config.b079_a2_blacklisted_rooms) { if (room.Name.ToLower().Contains(item.ToLower())) { plr.RH.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; response = plugin.Config.b079_msg_a2_fail; return(true); } } Timing.RunCoroutine(PluginEvents.GasRoom(room, plr.RH)); response = plugin.Config.b079_msg_a2_run; return(true); } if (args[1].ToLower().Equals("a3")) { if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a3_tier) { response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a3_tier + 1)); return(true); } if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a3_power) { plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a3_power; } else { response = plugin.Config.b079_msg_no_power; return(true); } Generator079.Generators[0].RpcCustomOverchargeForOurBeautifulModCreators(plugin.Config.b079_a3_timer, false); response = plugin.Config.b079_msg_a3_run; return(true); } if (args[1].ToLower().Equals("a4")) { if (plr.RH.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a4_tier) { response = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a4_tier + 1)); return(true); } if (plr.RH.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a4_power) { plr.RH.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a4_power; } else { response = plugin.Config.b079_msg_no_power; return(true); } var pos = plr.RH.scp079PlayerScript.currentCamera.transform.position; GrenadeManager gm = plr.RH.GetComponent <GrenadeManager>(); GrenadeSettings settings = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFlash); FlashGrenade flash = GameObject.Instantiate(settings.grenadeInstance).GetComponent <FlashGrenade>(); flash.fuseDuration = 0.5f; flash.InitData(gm, Vector3.zero, Vector3.zero, 1f); flash.transform.position = pos; NetworkServer.Spawn(flash.gameObject); response = plugin.Config.b079_msg_a4_run; return(true); } response = plugin.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + plugin.Config.b079_prefix); return(true); } response = plugin.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + plugin.Config.b079_prefix); return(true); } } } response = Better079Plugin.instance.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + Better079Plugin.instance.Config.b079_prefix); return(false); }
/// <summary> /// Initializes a new instance of the <see cref="ElevatorTeleportEventArgs"/> class. /// </summary> /// <param name="player"><inheritdoc cref="ElevatorTeleportingEventArgs.Player"/></param> /// <param name="camera"><inheritdoc cref="ElevatorTeleportingEventArgs.Camera"/></param> /// <param name="auxiliaryPowerCost"><inheritdoc cref="ElevatorTeleportingEventArgs.AuxiliaryPowerCost"/></param> /// <param name="isAllowed"><inheritdoc cref="ElevatorTeleportingEventArgs.IsAllowed"/></param> public ElevatorTeleportEventArgs(Player player, Camera079 camera, float auxiliaryPowerCost, bool isAllowed = true) : base(player, camera, auxiliaryPowerCost, isAllowed) { }
public bool Execute(ArraySegment <string> arguments, ICommandSender sender, out string response) { var ply = Player.Get((sender as CommandSender)?.SenderId); if (ply.Role != RoleType.Scp079) { response = PluginMain.Instance.Config.NotScp079; return(false); } if (arguments.Count != 1) { response = "Команды: \n.079 blackout - выключает свет во всём комплексе \n.079 flash - делает вспышку камерой \n.079 cancel - останавливает боеголовку\n.079 find - Находит случайного игрока на камерах"; return(false); } var args = arguments.Array; switch (args[1].ToLower()) { case "blackout": if (ply.Level < PluginMain.Instance.Config.BlackoutLvl) { response = PluginMain.Instance.Config.InsufLVL; return(false); } if (PluginMain.Instance.IsBlackoutOnCooldown) { response = PluginMain.Instance.Config.OnCooldown; return(false); } PluginMain.Instance.IsBlackoutOnCooldown = true; Timing.CallDelayed(PluginMain.Instance.Config.BlackoutCooldown, () => PluginMain.Instance.IsBlackoutOnCooldown = false); if (ply.Energy >= PluginMain.Instance.Config.BlackoutEnergy) { ply.Energy -= PluginMain.Instance.Config.BlackoutEnergy; } else { response = PluginMain.Instance.Config.NoEnergyMsg; return(false); } Map.TurnOffAllLights(PluginMain.Instance.Config.BlackoutTime); response = PluginMain.Instance.Config.AbilitySuccess; try { CommsHack.AudioAPI.API.PlayFileRaw($"{Paths.Configs}/CommsHackAudio/{PluginMain.Instance.Config.BlackoutSoundPath}", PluginMain.Instance.Config.BlackoutSoundVolume); } catch (Exception x) { Log.Info("CommsHack is not installed, skipping method call, playing cassie instead"); Log.Error(x); Cassie.Message(PluginMain.Instance.Config.BlackoutCassie, true); } return(true); case "help": response = "Команды: \n.079 blackout - выключает свет во всём комплексе \n.079 flash - делает вспышку камерой \n.079 cancel - останавливает боеголовку\n.079 find - Находит случайного игрока на камерах"; return(true); case "cancel": if (Warhead.IsInProgress) { if (PluginMain.Instance.Handler.IsNukeOnCooldown) { response = PluginMain.Instance.Config.CancelCooldownMsg; return(false); } if (ply.Level < PluginMain.Instance.Config.WarheadCancelLvl) { response = PluginMain.Instance.Config.InsufLVL; return(true); } if (ply.Energy >= PluginMain.Instance.Config.WarheadCancelEnergy) { ply.Energy -= PluginMain.Instance.Config.WarheadCancelEnergy; } else { response = PluginMain.Instance.Config.NoEnergyMsg; return(true); } if (Warhead.IsLocked) { response = PluginMain.Instance.Config.IsNotInProgressOrLocked; return(false); } Timing.RunCoroutine(PluginMain.Instance.Handler.Nuke(), "nuke"); response = PluginMain.Instance.Config.AbilitySuccess; return(true); } else { response = PluginMain.Instance.Config.IsNotInProgressOrLocked; return(true); } case "flash": if (ply.Level < PluginMain.Instance.Config.FlashLVL) { response = PluginMain.Instance.Config.InsufLVL; return(true); } if (PluginMain.Instance.IsFlashOnCooldown) { response = PluginMain.Instance.Config.OnCooldown; return(false); } if (ply.Energy >= PluginMain.Instance.Config.FlashEnergy) { ply.Energy -= PluginMain.Instance.Config.FlashEnergy; } else { response = PluginMain.Instance.Config.NoEnergyMsg; return(true); } var pos = ply.ReferenceHub.scp079PlayerScript.currentCamera.transform.position; ply.SpawnFlashGrenade(pos, 0.5f); PluginMain.Instance.IsFlashOnCooldown = true; Timing.CallDelayed(PluginMain.Instance.Config.FlashCooldown, () => PluginMain.Instance.IsFlashOnCooldown = false); foreach (var player in Player.List) { if (player.Role == RoleType.Scp106 && Vector3.Distance(player.Position, pos) <= 75) { player.EnableEffect(Exiled.API.Enums.EffectType.Blinded, 2); break; } } response = PluginMain.Instance.Config.AbilitySuccess; return(true); case "find": if (ply.Level < PluginMain.Instance.Config.FindLVL) { response = PluginMain.Instance.Config.InsufLVL; return(false); } if (ply.Energy >= PluginMain.Instance.Config.FindEnergy) { ply.Energy -= PluginMain.Instance.Config.FindEnergy; } else { response = PluginMain.Instance.Config.NoEnergyMsg; return(false); } if (Player.List.Where(x => x.Team != Team.SCP && x.Team != Team.TUT && x.Team != Team.RIP).IsEmpty()) { response = PluginMain.Instance.Config.FindNoPlayers; return(false); } Player trackingPlayer = Player.List.Where(x => x.Team != Team.SCP && x.Team != Team.TUT && x.Team != Team.RIP).ToList()[UnityEngine.Random.Range(0, Player.List.Where(x => x.Team != Team.SCP && x.Team != Team.TUT && x.Team != Team.RIP).Count() - 1)]; Camera079 nearestCamera = Scp079PlayerScript.allCameras.First(); float distance = float.MaxValue; float ADistance; foreach (var cam in Scp079PlayerScript.allCameras) { ADistance = Vector3.Distance(cam.transform.position, trackingPlayer.Position); if (ADistance < distance) { nearestCamera = cam; distance = ADistance; } } ply.ReferenceHub.scp079PlayerScript.CmdSwitchCamera(nearestCamera.cameraId, false); UnityEngine.Random.InitState((int)DateTime.Now.Ticks); response = $"Отслеживаю: {trackingPlayer.DisplayNickname ?? trackingPlayer.Nickname} - {trackingPlayer.Role}"; return(false); default: response = "Команды:\n.079 blackout - выключает свет во всём комплексе \n.079 flash - делает вспышку камерой \n.079 cancel - останавливает боеголовку\n.079 find - Находит случайного игрока на камерах"; return(false); } }
public static Synapse.Api.Camera GetSynapseCamera(this Camera079 camera) => Map.Get.Cameras.FirstOrDefault(x => x.GameObject == camera.gameObject);
private static bool Scp079Interact(Scp079PlayerScript __instance, Command079 command, string args, GameObject target) { args ??= ""; try { if (!__instance._interactRateLimit.CanExecute(true)) { return(false); } if (!__instance.iAm079) { return(false); } string[] array = args.Split(':'); GameCore.Console.AddDebugLog("SCP079", "Command received from a client: " + command, MessageImportance.LessImportant, false); __instance.RefreshCurrentRoom(); if (!__instance.CheckInteractableLegitness(__instance.CurrentRoom, target, true)) { return(false); } DoorVariant doorVariant = null; // F you, compiler bool gotDoorVariant = target?.TryGetComponent(out doorVariant) ?? false; List <string> list = GameCore.ConfigFile.ServerConfig.GetStringList("scp079_door_blacklist") ?? new List <string>(); switch (command) { case Command079.Door: { if (AlphaWarheadController.Host.inProgress) { return(false); } if (target == null) { GameCore.Console.AddDebugLog("SCP079", "The door command requires a target.", MessageImportance.LessImportant, false); return(false); } if (!gotDoorVariant) { return(false); } if (doorVariant.TryGetComponent(out DoorNametagExtension doorNametagExtension) && list.Count > 0 && list.Contains(doorNametagExtension.GetName)) { GameCore.Console.AddDebugLog("SCP079", "Door access denied by the server.", MessageImportance.LeastImportant, false); return(false); } string text = doorVariant.RequiredPermissions.RequiredPermissions.ToString(); float manaFromLabel = __instance.GetManaFromLabel("Door Interaction " + (text.Contains(",") ? text.Split(',')[0] : text), __instance.abilities); var action = doorVariant.TargetState ? Scp079EventMisc.DoorAction.Closing : Scp079EventMisc.DoorAction.Opening; var intendedResult = manaFromLabel <= __instance.Mana ? Scp079EventMisc.InteractionResult.Allow : Scp079EventMisc.InteractionResult.NoEnergy; SynapseController.Server.Events.Scp.Scp079.Invoke079DoorInteract( __instance.gameObject.GetPlayer(), action, intendedResult, manaFromLabel, doorVariant.GetDoor(), out var actualResult ); switch (actualResult) { case Scp079EventMisc.InteractionResult.Allow: { bool targetState = doorVariant.TargetState; doorVariant.ServerInteract(ReferenceHub.GetHub(__instance.gameObject), 0); if (targetState != doorVariant.TargetState) { __instance.Mana -= manaFromLabel; __instance.AddInteractionToHistory(target, true); GameCore.Console.AddDebugLog("SCP079", "Door state changed.", MessageImportance.LeastImportant, false); return(false); } GameCore.Console.AddDebugLog("SCP079", "Door state failed to change.", MessageImportance.LeastImportant, false); return(false); } case Scp079EventMisc.InteractionResult.Disallow: { GameCore.Console.AddDebugLog("SCP079", "Door access denied by the server.", MessageImportance.LeastImportant, false); return(false); } case Scp079EventMisc.InteractionResult.NoEnergy: { GameCore.Console.AddDebugLog("SCP079", "Not enough mana.", MessageImportance.LeastImportant, false); // might wanna change __instance.Mana to 0, // the client may do another check when being told that the player has not enough mana, // resulting in realizing they do indeed have enough mana __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); return(false); } } return(false); } case Command079.Doorlock: { if (AlphaWarheadController.Host.inProgress) { return(false); } if (target == null) { GameCore.Console.AddDebugLog("SCP079", "The door lock command requires a target.", MessageImportance.LessImportant, false); return(false); } if (doorVariant == null) { return(false); } ; if (doorVariant.TryGetComponent(out DoorNametagExtension doorNametagExtension2) && list.Count > 0 && list.Contains(doorNametagExtension2.GetName)) { GameCore.Console.AddDebugLog("SCP079", "Door access denied by the server.", MessageImportance.LeastImportant, false); return(false); } float manaFromLabel = __instance.GetManaFromLabel("Door Lock Minimum", __instance.abilities); var action = ((DoorLockReason)doorVariant.ActiveLocks).HasFlag(DoorLockReason.Regular079) ? Scp079EventMisc.DoorAction.Unlocking : Scp079EventMisc.DoorAction.Locking; Scp079EventMisc.InteractionResult intendedResult; if (action == Scp079EventMisc.DoorAction.Unlocking) { intendedResult = __instance.lockedDoors.Contains(doorVariant.netId) ? Scp079EventMisc.InteractionResult.Allow : Scp079EventMisc.InteractionResult.Disallow; } else { intendedResult = manaFromLabel <= __instance.Mana ? Scp079EventMisc.InteractionResult.Allow : Scp079EventMisc.InteractionResult.NoEnergy; } SynapseController.Server.Events.Scp.Scp079.Invoke079DoorInteract( __instance.gameObject.GetPlayer(), action, intendedResult, manaFromLabel, doorVariant.GetDoor(), out var actualResult ); switch (actualResult) { case Scp079EventMisc.InteractionResult.Allow when action == Scp079EventMisc.DoorAction.Unlocking: { if (!__instance.lockedDoors.Contains(doorVariant.netId)) { return(false); } __instance.lockedDoors.Remove(doorVariant.netId); doorVariant.ServerChangeLock(DoorLockReason.Regular079, false); return(false); } case Scp079EventMisc.InteractionResult.Allow when action == Scp079EventMisc.DoorAction.Locking: { if (!__instance.lockedDoors.Contains(doorVariant.netId)) { __instance.lockedDoors.Add(doorVariant.netId); } doorVariant.ServerChangeLock(DoorLockReason.Regular079, true); __instance.AddInteractionToHistory(doorVariant.gameObject, true); __instance.Mana -= __instance.GetManaFromLabel("Door Lock Start", __instance.abilities); return(false); } case Scp079EventMisc.InteractionResult.Disallow: { return(false); } case Scp079EventMisc.InteractionResult.NoEnergy: { // might wanna change __instance.Mana to 0, // the client may do another check when being told that the player has not enough mana, // resulting in realizing they do indeed have enough mana __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); return(false); } } return(false); } case Command079.Speaker: { string speakerQualifiedName = __instance.CurrentRoom.transform.parent.name + "/" + __instance.CurrentRoom.name + "/Scp079Speaker"; GameObject speaker = GameObject.Find(speakerQualifiedName); float manaFromLabel = __instance.GetManaFromLabel("Speaker Start", __instance.abilities); Scp079EventMisc.InteractionResult intendedResult; if (speaker == null) { intendedResult = Scp079EventMisc.InteractionResult.Disallow; } else if (manaFromLabel * 1.5f <= __instance.Mana) { intendedResult = Scp079EventMisc.InteractionResult.Allow; } else { intendedResult = Scp079EventMisc.InteractionResult.NoEnergy; } SynapseController.Server.Events.Scp.Scp079.Invoke079SpeakerInteract( __instance.gameObject.GetPlayer(), manaFromLabel, intendedResult, out var actualResult ); switch (actualResult) { case Scp079EventMisc.InteractionResult.Allow: { __instance.Mana -= manaFromLabel; __instance.Speaker = speakerQualifiedName; __instance.AddInteractionToHistory(speaker, true); return(false); } case Scp079EventMisc.InteractionResult.Disallow: { return(false); } case Scp079EventMisc.InteractionResult.NoEnergy: { // might wanna change __instance.Mana to 0, // the client may do another check when being told that the player has not enough mana, // resulting in realizing they do indeed have enough mana __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); return(false); } } return(false); } case Command079.StopSpeaker: __instance.Speaker = string.Empty; return(false); case Command079.ElevatorTeleport: { Synapse.Api.Logger.Get.Debug("Teleport"); float manaFromLabel = __instance.GetManaFromLabel("Elevator Teleport", __instance.abilities); if (manaFromLabel > __instance.Mana) { __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); return(false); } Camera079 camera = null; foreach (Scp079Interactable scp079Interactable in __instance.nearbyInteractables) { if (scp079Interactable.type == Scp079Interactable.InteractableType.ElevatorTeleport) { camera = scp079Interactable.optionalObject.GetComponent <Camera079>(); } } if (camera != null) { __instance.RpcSwitchCamera(camera.cameraId, false); __instance.Mana -= manaFromLabel; __instance.AddInteractionToHistory(target, true); return(false); } if (ConsoleDebugMode.CheckImportance("SCP079", MessageImportance.LeastImportant, out Color32 color)) { Scp079Interactable scp079Interactable2 = null; Dictionary <Scp079Interactable.InteractableType, byte> dictionary = new Dictionary <Scp079Interactable.InteractableType, byte>(); foreach (Scp079Interactable scp079Interactable3 in __instance.nearbyInteractables) { if (dictionary.ContainsKey(scp079Interactable3.type)) { Dictionary <Scp079Interactable.InteractableType, byte> dictionary2 = dictionary; Scp079Interactable.InteractableType type = scp079Interactable3.type; byte b = dictionary2[type]; dictionary2[type] = (byte)(b + 1); } else { dictionary[scp079Interactable3.type] = 1; } if (scp079Interactable3.type == Scp079Interactable.InteractableType.ElevatorTeleport) { scp079Interactable2 = scp079Interactable3; } } string text2; if (scp079Interactable2 == null) { text2 = "None of the " + __instance.nearbyInteractables.Count + " were an ElevatorTeleport, found: "; using (Dictionary <Scp079Interactable.InteractableType, byte> .Enumerator enumerator2 = dictionary.GetEnumerator()) { while (enumerator2.MoveNext()) { KeyValuePair <Scp079Interactable.InteractableType, byte> keyValuePair = enumerator2.Current; text2 = string.Concat(new object[] { text2, keyValuePair.Value, "x", keyValuePair.Key.ToString().Substring(keyValuePair.Key.ToString().Length - 4), " " }); } goto IL_755; } } if (scp079Interactable2.optionalObject == null) { text2 = "Optional object is missing."; } else if (scp079Interactable2.optionalObject.GetComponent <Camera079>() == null) { string str = ""; Transform transform = scp079Interactable2.optionalObject.transform; for (int i = 0; i < 5; i++) { str = transform.name + str; if (!(transform.parent != null)) { break; } transform = transform.parent; } text2 = "Camera is missing at " + str; } else { text2 = "Unknown error"; } IL_755: GameCore.Console.AddDebugLog("SCP079", "Could not find the second elevator: " + text2, MessageImportance.LeastImportant, false); return(false); } return(false); } case Command079.ElevatorUse: { float manaFromLabel = __instance.GetManaFromLabel("Elevator Use", __instance.abilities); string elevatorName = string.Empty; if (array.Length > 0) { elevatorName = array[0]; } Elevator synElevator = Map.Get.Elevators.Find(_ => _.Name == elevatorName); Scp079EventMisc.InteractionResult intendedResult; if (manaFromLabel <= __instance.Mana) { intendedResult = Scp079EventMisc.InteractionResult.NoEnergy; } else if (synElevator == null || (AlphaWarheadController.Host.timeToDetonation == 0f || !synElevator.Operative || synElevator.Locked)) { intendedResult = Scp079EventMisc.InteractionResult.Disallow; } else { intendedResult = Scp079EventMisc.InteractionResult.Allow; } intendedResult = manaFromLabel <= __instance.Mana ? Scp079EventMisc.InteractionResult.Allow : Scp079EventMisc.InteractionResult.NoEnergy; SynapseController.Server.Events.Scp.Scp079.Invoke079ElevatorUse( __instance.gameObject.GetPlayer(), manaFromLabel, synElevator, intendedResult, out var actualResult ); switch (actualResult) { case Scp079EventMisc.InteractionResult.Allow: { if (synElevator.Use()) { __instance.Mana -= manaFromLabel; bool flag3 = false; foreach (Lift.Elevator elevator in synElevator.Lift.elevators) { __instance.AddInteractionToHistory(elevator.door.GetComponentInParent <Scp079Interactable>().gameObject, !flag3); flag3 = true; } } return(false); } case Scp079EventMisc.InteractionResult.Disallow: { return(false); } case Scp079EventMisc.InteractionResult.NoEnergy: { // might wanna change __instance.Mana to 0, // the client may do another check when being told that the player has not enough mana, // resulting in realizing they do indeed have enough mana __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); return(false); } } return(false); } case Command079.Tesla: { float manaFromLabel = __instance.GetManaFromLabel("Tesla Gate Burst", __instance.abilities); if (__instance.CurrentRoom != null) { TeslaGate vanillaTesla = __instance.CurrentRoom.GetComponentInChildren <TeslaGate>(); Tesla synapseTesla = vanillaTesla != null?Server.Get.Map.Teslas.Find(_ => _.Gate == vanillaTesla) : null; var intendedResult = manaFromLabel <= __instance.Mana ? Scp079EventMisc.InteractionResult.Allow : Scp079EventMisc.InteractionResult.NoEnergy; SynapseController.Server.Events.Scp.Scp079.Invoke079TeslaInteract( __instance.gameObject.GetPlayer(), manaFromLabel, synapseTesla?.Room, synapseTesla, intendedResult, out var actualResult ); switch (actualResult) { case Scp079EventMisc.InteractionResult.Allow: { if (vanillaTesla != null) { vanillaTesla.RpcInstantBurst(); } __instance.AddInteractionToHistory(vanillaTesla.gameObject, true); __instance.Mana -= manaFromLabel; return(false); } case Scp079EventMisc.InteractionResult.Disallow: { return(false); } case Scp079EventMisc.InteractionResult.NoEnergy: { // might wanna change __instance.Mana to 0, // the client may do another check when being told that the player has not enough mana, // resulting in realizing they do indeed have enough mana __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); return(false); } } return(false); } throw new Exception("Unable to find Tesla Gate in a null room"); } case Command079.Lockdown: { if (AlphaWarheadController.Host.inProgress) { GameCore.Console.AddDebugLog("SCP079", "Lockdown cannot commence, Warhead in progress.", MessageImportance.LessImportant, false); return(false); } float manaFromLabel = __instance.GetManaFromLabel("Room Lockdown", __instance.abilities); GameCore.Console.AddDebugLog("SCP079", "Attempting lockdown...", MessageImportance.LeastImportant, false); if (__instance.CurrentRoom != null) { HashSet <Scp079Interactable> roomInteractablesHashSet = Scp079Interactable.InteractablesByRoomId[__instance.CurrentRoom.UniqueId]; HashSet <DoorVariant> doorHashSet = new HashSet <DoorVariant>(); GameCore.Console.AddDebugLog("SCP079", "Loaded all interactables", MessageImportance.LeastImportant, false); GameObject lockdownInteractable = null; foreach (Scp079Interactable interactable in roomInteractablesHashSet) { if (interactable != null) { if (interactable.type != Scp079Interactable.InteractableType.Door) { if (interactable.type == Scp079Interactable.InteractableType.Lockdown) { lockdownInteractable = interactable.gameObject; } } else if (interactable.TryGetComponent(out DoorVariant doorVariant2) && (object)doorVariant2 is IDamageableDoor damageableDoor && damageableDoor.IsDestroyed) { GameCore.Console.AddDebugLog("SCP079", "Lockdown can't initiate, one of the doors were destroyed.", MessageImportance.LessImportant, false); return(false); } } } if (__instance.CurrentLDCooldown > 0f) { GameCore.Console.AddDebugLog("SCP079", "Lockdown still on cooldown.", MessageImportance.LessImportant, false); return(false); } GameCore.Console.AddDebugLog("SCP079", "Looking for doors to lock...", MessageImportance.LeastImportant, false); foreach (Scp079Interactable scp079Interactable5 in roomInteractablesHashSet) { if (!(scp079Interactable5 == null) && scp079Interactable5.TryGetComponent(out DoorVariant doorVariant3)) { bool doorLocked = doorVariant3.ActiveLocks == (ushort)DoorLockReason.None; if (!doorLocked) { DoorLockMode mode = DoorLockUtils.GetMode((DoorLockReason)doorVariant3.ActiveLocks); doorLocked = (mode.HasFlagFast(DoorLockMode.CanClose) || mode.HasFlagFast(DoorLockMode.ScpOverride)); } if (doorLocked) { if (doorVariant3.TargetState) { doorVariant3.NetworkTargetState = false; } doorVariant3.ServerChangeLock(DoorLockReason.Lockdown079, true); doorVariant3.UnlockLater(__instance.LockdownDuration, DoorLockReason.Lockdown079); doorHashSet.Add(doorVariant3); } } } var intendedResult = manaFromLabel <= __instance.Mana ? Scp079EventMisc.InteractionResult.Allow : Scp079EventMisc.InteractionResult.NoEnergy; bool lightsOut = true; SynapseController.Server.Events.Scp.Scp079.Invoke079RoomLockdown( __instance.gameObject.GetPlayer(), manaFromLabel, Server.Get.Map.Rooms.Find(_ => _.GameObject == __instance.CurrentRoom), // FIX ref lightsOut, intendedResult, out var actualResult ); switch (actualResult) { case Scp079EventMisc.InteractionResult.Allow: { foreach (FlickerableLightController flickerableLightController in __instance.CurrentRoom.GetComponentsInChildren <FlickerableLightController>()) { if (flickerableLightController != null) { flickerableLightController.ServerFlickerLights(8f); } } __instance.CurrentLDCooldown = __instance.LockdownCooldown + __instance.LockdownDuration; __instance.TargetSetLockdownCooldown(__instance.connectionToClient, __instance.CurrentLDCooldown); GameCore.Console.AddDebugLog("SCP079", "Lockdown initiated.", MessageImportance.LessImportant, false); __instance.AddInteractionToHistory(lockdownInteractable, true); __instance.Mana -= __instance.GetManaFromLabel("Room Lockdown", __instance.abilities); return(false); } case Scp079EventMisc.InteractionResult.Disallow: { return(false); } case Scp079EventMisc.InteractionResult.NoEnergy: { // might wanna change __instance.Mana to 0, // the client may do another check when being told that the player has not enough mana, // resulting in realizing they do indeed have enough mana __instance.RpcNotEnoughMana(manaFromLabel, __instance.Mana); GameCore.Console.AddDebugLog("SCP079", "Lockdown cannot commence, not enough mana.", MessageImportance.LessImportant, false); return(false); } } } else { GameCore.Console.AddDebugLog("SCP079", "Room couldn't be specified.", MessageImportance.Normal, false); } return(false); } default: return(false); } } catch (Exception e) { Synapse.Api.Logger.Get.Error($"Synapse-Event: Scp079BulkPatch failed!!\n{e}"); return(false); } }
// https://github.com/galaxy119/EXILED/blob/master/EXILED_Main/Extensions/Player.cs public void ConsoleCmd(SendingConsoleCommandEventArgs ev) { if (ev.Player.Role.Equals(RoleType.Scp079)) { if (ev.Name.Equals(plugin.Config.b079_prefix)) { ev.Allow = false; if (ev.Arguments.IsEmpty()) { ev.ReturnMessage = plugin.Config.b079_help_title + "\n" + "\"." + plugin.Config.b079_prefix + " a1\" - " + plugin.Config.b079_help_a1 + " - " + plugin.Config.b079_a1_power + "+ AP - Tier " + (plugin.Config.b079_a1_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a2\" - " + plugin.Config.b079_help_a2 + " - " + plugin.Config.b079_a2_power + "+ AP - Tier " + (plugin.Config.b079_a2_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a3\" - " + plugin.Config.b079_help_a3 + " - " + plugin.Config.b079_a3_power + "+ AP - Tier " + (plugin.Config.b079_a3_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a4\" - " + plugin.Config.b079_help_a4 + " - " + plugin.Config.b079_a4_power + "+ AP - Tier " + (plugin.Config.b079_a4_tier + 1) + "+\n"; return; } if (ev.Arguments.Count >= 1) { if (ev.Arguments[0].ToLower().Equals("help") || ev.Arguments[0].ToLower().Equals("commands") || ev.Arguments[0].ToLower().Equals("?")) { ev.ReturnMessage = plugin.Config.b079_help_title + "\n" + "\"." + plugin.Config.b079_prefix + " a1\" - " + plugin.Config.b079_help_a1 + " - " + plugin.Config.b079_a1_power + "+ AP - Tier " + (plugin.Config.b079_a1_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a2\" - " + plugin.Config.b079_help_a2 + " - " + plugin.Config.b079_a2_power + "+ AP - Tier " + (plugin.Config.b079_a2_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a3\" - " + plugin.Config.b079_help_a3 + " - " + plugin.Config.b079_a3_power + "+ AP - Tier " + (plugin.Config.b079_a3_tier + 1) + "+\n" + "\"." + plugin.Config.b079_prefix + " a4\" - " + plugin.Config.b079_help_a4 + " - " + plugin.Config.b079_a4_power + "+ AP - Tier " + (plugin.Config.b079_a4_tier + 1) + "+\n"; return; } if (ev.Arguments[0].ToLower().Equals("a1")) { if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a1_tier) { ev.ReturnMessage = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a1_tier + 1)); return; } if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a1_power) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a1_power; } else { ev.ReturnMessage = plugin.Config.b079_msg_no_power; return; } var cams = GetSCPCameras(); if (cams.Count > 0) { Camera079 cam = cams[UnityEngine.Random.Range(0, cams.Count)]; ev.Player.ReferenceHub.scp079PlayerScript.CmdSwitchCamera(cam.cameraId, false); ev.ReturnMessage = plugin.Config.b079_msg_a1_run; return; } else { ev.ReturnMessage = plugin.Config.b079_msg_a1_fail; ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a1_power; return; } } if (ev.Arguments[0].ToLower().Equals("a2")) { if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a2_tier) { ev.ReturnMessage = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a2_tier + 1)); return; } if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a2_power) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a2_power; } else { ev.ReturnMessage = plugin.Config.b079_msg_no_power; return; } if (Time.timeSinceLevelLoad - a2cooldown < plugin.Config.b079_a2_cooldown) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; ev.ReturnMessage = plugin.Config.b079_msg_a2_fail; return; } Room room = ev.Player.CurrentRoom; if (room == null) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; ev.ReturnMessage = plugin.Config.b079_msg_a2_fail; return; } if (room.Zone == ZoneType.Surface) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; ev.ReturnMessage = plugin.Config.b079_msg_a2_fail; return; } foreach (var item in plugin.Config.b079_a2_blacklisted_rooms) { if (room.Name.ToLower().Contains(item.ToLower())) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana += plugin.Config.b079_a2_power; ev.ReturnMessage = plugin.Config.b079_msg_a2_fail; return; } } Timing.RunCoroutine(GasRoom(room, ev.Player.ReferenceHub)); ev.ReturnMessage = plugin.Config.b079_msg_a2_run; return; } if (ev.Arguments[0].ToLower().Equals("a3")) { if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a3_tier) { ev.ReturnMessage = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a3_tier + 1)); return; } if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a3_power) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a3_power; } else { ev.ReturnMessage = plugin.Config.b079_msg_no_power; return; } Generator079.Generators[0].ServerOvercharge(plugin.Config.b079_a3_timer, false); ev.ReturnMessage = plugin.Config.b079_msg_a3_run; return; } if (ev.Arguments[0].ToLower().Equals("a4")) { if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurLvl < plugin.Config.b079_a4_tier) { ev.ReturnMessage = plugin.Config.b079_msg_tier_required.Replace("$tier", "" + (plugin.Config.b079_a4_tier + 1)); return; } if (a4cooldown >= Time.time) { ev.ReturnMessage = $"<color=red>This ability is in CoolDown ({(int) (a4cooldown - Time.time)})</color>"; return; } if (ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana >= plugin.Config.b079_a4_power) { ev.Player.ReferenceHub.scp079PlayerScript.NetworkcurMana -= plugin.Config.b079_a4_power; } else { ev.ReturnMessage = plugin.Config.b079_msg_no_power; return; } a4cooldown = Time.time + 5f; var pos = ev.Player.ReferenceHub.scp079PlayerScript.currentCamera.transform.position; GrenadeManager gm = ev.Player.ReferenceHub.GetComponent <GrenadeManager>(); GrenadeSettings settings = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFlash); FlashGrenade flash = GameObject.Instantiate(settings.grenadeInstance).GetComponent <FlashGrenade>(); flash.fuseDuration = 0.5f; flash.InitData(gm, Vector3.zero, Vector3.zero, 1f); flash.transform.position = pos; NetworkServer.Spawn(flash.gameObject); ev.ReturnMessage = plugin.Config.b079_msg_a4_run; return; } ev.ReturnMessage = plugin.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + plugin.Config.b079_prefix); return; } ev.ReturnMessage = plugin.Config.b079_msg_help_cmd_fail.Replace("$prefix", "" + plugin.Config.b079_prefix); return; } } }
internal Camera(Camera079 camera, Room room) { cam = camera; Room = room; }
/// <summary> /// Returns the <see cref="ZoneType"/> the camera is in. /// </summary> /// <param name="camera">The <see cref="Camera079"/> to check.</param> /// <returns>The <see cref="ZoneType"/> of the zone the camera is in.</returns> public static ZoneType Zone(this Camera079 camera) => Room(camera)?.Zone ?? ZoneType.Unspecified;
/// <summary> /// Gets the <see cref="CameraType"/>. /// </summary> /// <param name="camera">The <see cref="Camera079"/> to check.</param> /// <returns>The <see cref="CameraType"/>.</returns> public static CameraType Type(this Camera079 camera) => OrderedCameraTypes.TryGetValue(camera.GetInstanceID(), out CameraType cameraType) ? cameraType : CameraType.Unknown;
/// <summary> /// Returns the <see cref="Room"/> the camera is in, or null if not found. /// </summary> /// <param name="camera">The <see cref="Camera079"/> to check.</param> /// <returns>A <see cref="Room"/>, or null if not found.</returns> public static Room Room(this Camera079 camera) => OrderedCameraRooms.TryGetValue(camera.GetInstanceID(), out Room room) ? room : null;
/// <summary> /// Sets the camera of SCP-079. /// </summary> /// <param name="player"></param> /// <param name="camera"></param> /// <param name="lookAtRotation"></param> public static void SetCamera(this ReferenceHub player, Camera079 camera, bool lookAtRotation = false) => player.SetCamera(camera.cameraId, lookAtRotation);