Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of YTTV v1.1.2
YTTV.dll
Decompiled 5 months agousing System; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Net; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using GameNetcodeStuff; using HarmonyLib; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("YTTV")] [assembly: AssemblyDescription("The plugin ever")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCompany("YTTV")] [assembly: AssemblyProduct("YTTV")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("ad955809-1ecb-4d74-a640-73a1179c4822")] [assembly: AssemblyInformationalVersion("1.1.2")] [assembly: AssemblyFileVersion("1.1.2.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.1.2.0")] [module: UnverifiableCode] namespace Television_Controller { [BepInPlugin("MARMods.YTTV", "YTTV", "1.1.2")] public class Plugin : BaseUnityPlugin { public static Plugin instance; private static Harmony HarmonyLib; public static Configs config; private void Awake() { //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Expected O, but got Unknown instance = this; config = new Configs(); config.GetConfig(); string text = config.languages.Value.ToLower(); if (text == "en") { config.GetLang().GetConfigEN(); } else if (text == "ru") { config.GetLang().GetConfigRU(); } else { config.GetLang().GetConfigEN(); } WriteLogo(); if (!Directory.Exists("YTTV\\lang")) { Directory.CreateDirectory("YTTV\\lang"); } if (!Directory.Exists("YTTV\\other")) { Directory.CreateDirectory("YTTV\\other"); } if (File.Exists("YTTV\\other\\test.mp4")) { File.Delete("YTTV\\other\\test.mp4"); } if (!File.Exists("YTTV\\cache")) { using (File.CreateText("YTTV\\cache")) { } } string ytDlpPath = Path.Combine("YTTV", "other", "yt-dlp.exe"); string versionPath = Path.Combine("YTTV", "other", "yt-dlp.version"); new Thread((ThreadStart)delegate { try { string latestYtDlpTag = GetLatestYtDlpTag(); if (string.IsNullOrEmpty(latestYtDlpTag)) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"YTTV: Could not determine latest version (GitHub unreachable?). Skipping update check."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"YTTV: Ready (Offline Mode)."); } else { bool flag = true; if (File.Exists(ytDlpPath) && File.Exists(versionPath)) { string text2 = File.ReadAllText(versionPath).Trim(); if (text2 == latestYtDlpTag) { flag = false; } } if (flag) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("YTTV: Downloading yt-dlp version " + latestYtDlpTag + "...")); DownloadFileSync(new Uri("https://github.com/yt-dlp/yt-dlp/releases/download/" + latestYtDlpTag + "/yt-dlp.exe"), ytDlpPath); if (File.Exists(ytDlpPath)) { File.WriteAllText(versionPath, latestYtDlpTag); } } ((BaseUnityPlugin)this).Logger.LogInfo((object)"YTTV: Ready."); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("YTTV: Update failed (Check Internet/VPN): " + ex.Message)); } }).Start(); HarmonyLib = new Harmony("com.marmods.YTTV"); HarmonyLib.PatchAll(typeof(YTTV)); } private string GetLatestYtDlpTag() { try { HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://github.com/yt-dlp/yt-dlp/releases/latest"); httpWebRequest.Method = "HEAD"; httpWebRequest.AllowAutoRedirect = false; httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"; using WebResponse webResponse = httpWebRequest.GetResponse(); string text = webResponse.Headers["Location"]; if (!string.IsNullOrEmpty(text)) { return text.Substring(text.LastIndexOf('/') + 1); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("YTTV: Failed to fetch latest version tag: " + ex.Message)); } return null; } public void WriteLogo() { ((BaseUnityPlugin)this).Logger.LogInfo((object)"YTTV Loaded!"); } public static void DownloadFileSync(Uri uri, string filename) { try { if (File.Exists(filename)) { File.Delete(filename); } using WebClient webClient = new WebClient(); webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); webClient.DownloadFile(uri, filename); } catch (Exception ex) { throw ex; } } public static void DownloadFiles(Uri uri, string filename) { WebClient webClient = new WebClient(); webClient.DownloadFileCompleted += Web_DownloadFileCompleted; webClient.DownloadFileAsync(uri, filename); } private static void Web_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { Thread.CurrentThread.Abort(); } public void Log(object message) { ((BaseUnityPlugin)this).Logger.LogInfo(message); } } public class Configs { public class Lang { public ConfigEntry<string> main_1; public ConfigEntry<string> main_2; public ConfigEntry<string> main_3; public ConfigEntry<string> main_4; public ConfigEntry<string> main_5; public ConfigEntry<string> main_6; public ConfigEntry<string> main_7; public ConfigEntry<string> main_8; public ConfigEntry<string> main_9; public ConfigEntry<string> main_10; public ConfigEntry<string> main_11; public ConfigEntry<string> main_12; public ConfigEntry<string> main_13; public void GetConfigRU() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown ConfigFile val = new ConfigFile("YTTV\\lang\\television_ru.cfg", true); main_1 = val.Bind<string>("General", "Main_1", "Пожалуйста, подождите, загружаются дополнительные библиотеки...", (ConfigDescription)null); main_2 = val.Bind<string>("General", "Main_2", "Включить/Выключить Телевизор : [E]\n@2 - @3\n@1 громкость\nУвеличить громкость [PU]\nУменьшить громкость [PG]", (ConfigDescription)null); main_3 = val.Bind<string>("General", "Main_3", "Библиотеки загружены.", (ConfigDescription)null); main_4 = val.Bind<string>("General", "Main_4", "Видео загружается!", (ConfigDescription)null); main_5 = val.Bind<string>("General", "Main_5", "Команды:\n/tplay - Проиграть\n/ttime - Время\n/treset - Сброс\n/tposition - Позиция\n/tvolume - Громкость", (ConfigDescription)null); main_6 = val.Bind<string>("General", "Main_6", "Неверный URL!", (ConfigDescription)null); main_7 = val.Bind<string>("General", "Main_7", "Пожалуйста подождите...", (ConfigDescription)null); main_8 = val.Bind<string>("General", "Main_8", "Видео готово", (ConfigDescription)null); main_9 = val.Bind<string>("General", "Main_9", "@1 изменил громкость @2", (ConfigDescription)null); main_10 = val.Bind<string>("General", "Main_10", "Неверная громкость!", (ConfigDescription)null); main_11 = val.Bind<string>("General", "Main_11", "Ссылка недействительная!", (ConfigDescription)null); main_12 = val.Bind<string>("General", "Main_12", "Позиция: @1", (ConfigDescription)null); main_13 = val.Bind<string>("General", "Main_13", "Запоминание: @1", (ConfigDescription)null); } public void GetConfigEN() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown ConfigFile val = new ConfigFile("YTTV\\lang\\television_en.cfg", true); main_1 = val.Bind<string>("General", "Main_1", "Please wait, downloading libraries...", (ConfigDescription)null); main_2 = val.Bind<string>("General", "Main_2", "Toggle TV : [E]\n@2 - @3\n@1 volume\nVol Up [PG UP]\nVol Down [PG DN]", (ConfigDescription)null); main_3 = val.Bind<string>("General", "Main_3", "Libraries loaded.", (ConfigDescription)null); main_4 = val.Bind<string>("General", "Main_4", "Video is loading!", (ConfigDescription)null); main_5 = val.Bind<string>("General", "Main_5", "/tplay [LINK]\n/ttime [TIME]\n/treset\n/tposition [BOOL]\n/tvolume [0-100]", (ConfigDescription)null); main_6 = val.Bind<string>("General", "Main_6", "Invalid URL!", (ConfigDescription)null); main_7 = val.Bind<string>("General", "Main_7", "Please wait...", (ConfigDescription)null); main_8 = val.Bind<string>("General", "Main_8", "Video loaded.", (ConfigDescription)null); main_9 = val.Bind<string>("General", "Main_9", "@1 set volume to @2", (ConfigDescription)null); main_10 = val.Bind<string>("General", "Main_10", "Invalid Volume!", (ConfigDescription)null); main_11 = val.Bind<string>("General", "Main_11", "Link is invalid!", (ConfigDescription)null); main_12 = val.Bind<string>("General", "Main_12", "Time: @1", (ConfigDescription)null); main_13 = val.Bind<string>("General", "Main_13", "Memory: @1", (ConfigDescription)null); } } public ConfigEntry<bool> requstbattery; public ConfigEntry<string> languages; public static Lang lang = new Lang(); public void GetConfig() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown string text = Path.Combine(Paths.ConfigPath, "YTTV.cfg"); ConfigFile val = new ConfigFile(text, true); languages = val.Bind<string>("General", "Languages", "en", "en = English, ru = Русский"); } public Lang GetLang() { return lang; } } public class YTTV { public static TVScript tvScript = new TVScript(); public static string LastMessage; public static bool LoadingVideo = false; public static bool LoadingLibrary = false; public static string LastnameOfUserWhoTyped; public static string Lastname; public static double curretTime = 0.0; public static double totalTime = 0.0; public static bool positionSafe = false; public static double positionTime = 0.0; public static bool isPlayTelevision = false; public static double volumeMain = 0.0; [HarmonyPatch(typeof(PlayerControllerB), "SetHoverTipAndCurrentInteractTrigger")] [HarmonyPostfix] public static void SetHoverTipAndCurrentInteractTrigger(PlayerControllerB __instance) { InteractTrigger hoveringOverTrigger = __instance.hoveringOverTrigger; if ((Object)(object)hoveringOverTrigger == (Object)null || !hoveringOverTrigger.interactable || !((Object)(object)((Component)hoveringOverTrigger).transform.parent != (Object)null) || (!((Object)((Component)hoveringOverTrigger).transform.parent).name.Contains("Television") && !hoveringOverTrigger.hoverTip.Contains("Switch TV"))) { return; } if (!File.Exists("YTTV\\other\\yt-dlp.exe")) { hoveringOverTrigger.hoverTip = Plugin.config.GetLang().main_1.Value; return; } float volume = tvScript.tvSFX.volume; int num = (int)curretTime % 3600; string text = Mathf.Floor((float)((int)curretTime / 3600)).ToString("00"); string text2 = Mathf.Floor((float)(num / 60)).ToString("00"); string text3 = Mathf.Floor((float)(num % 60)).ToString("00"); int num2 = (int)totalTime % 3600; string text4 = Mathf.Floor((float)((int)totalTime / 3600)).ToString("00"); string text5 = Mathf.Floor((float)(num2 / 60)).ToString("00"); string text6 = Mathf.Floor((float)(num2 % 60)).ToString("00"); hoveringOverTrigger.hoverTip = Plugin.config.GetLang().main_2.Value.Replace("@1", $"{Math.Round(volume * 100f)}%").Replace("@2", text + ":" + text2 + ":" + text3).Replace("@3", text4 + ":" + text5 + ":" + text6); if (((ButtonControl)Keyboard.current.pageDownKey).wasPressedThisFrame && volume > 0f) { float num3 = volume - 0.1f; if (num3 < 0f) { num3 = 0f; } tvScript.tvSFX.volume = num3; volumeMain = num3; ChangeVolume(new StreamWriter("YTTV\\cache")); } if (((ButtonControl)Keyboard.current.pageUpKey).wasPressedThisFrame && volume < 1f) { float num4 = volume + 0.1f; if (num4 > 1f) { num4 = 1f; } tvScript.tvSFX.volume = num4; volumeMain = num4; ChangeVolume(new StreamWriter("YTTV\\cache")); } } public static void ChangeVolume(StreamWriter streamWriter) { streamWriter.WriteLine(volumeMain.ToString()); streamWriter.Close(); } [HarmonyPatch(typeof(HUDManager), "AddPlayerChatMessageServerRpc")] [HarmonyPostfix] [ServerRpc(RequireOwnership = false)] private static void AddPlayerChatMessageServerRpc(HUDManager __instance, string chatMessage, int playerId) { if (chatMessage.Length > 50) { ((object)__instance).GetType().GetMethod("AddPlayerChatMessageClientRpc", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(__instance, new object[2] { chatMessage, playerId }); } } [HarmonyPatch(typeof(HUDManager), "AddChatMessage")] [HarmonyPrefix] private static bool AddChatMessage(HUDManager __instance, string chatMessage, string nameOfUserWhoTyped) { if (!(__instance.lastChatMessage == chatMessage)) { __instance.lastChatMessage = chatMessage; __instance.PingHUDElement(__instance.Chat, 4f, 1f, 0.2f); if (__instance.ChatMessageHistory.Count >= 4) { ((TMP_Text)__instance.chatText).text.Remove(0, __instance.ChatMessageHistory[0].Length); __instance.ChatMessageHistory.Remove(__instance.ChatMessageHistory[0]); } StringBuilder stringBuilder = new StringBuilder(chatMessage); stringBuilder.Replace("[playerNum0]", StartOfRound.Instance.allPlayerScripts[0].playerUsername); stringBuilder.Replace("[playerNum1]", StartOfRound.Instance.allPlayerScripts[1].playerUsername); stringBuilder.Replace("[playerNum2]", StartOfRound.Instance.allPlayerScripts[2].playerUsername); stringBuilder.Replace("[playerNum3]", StartOfRound.Instance.allPlayerScripts[3].playerUsername); chatMessage = stringBuilder.ToString(); string item = ((!string.IsNullOrEmpty(nameOfUserWhoTyped)) ? ("<color=#FF0000>" + nameOfUserWhoTyped + "</color>: <color=#FFFF00>'" + chatMessage + "'</color>") : ("<color=#7069ff>" + chatMessage + "</color>")); __instance.ChatMessageHistory.Add(item); ((TMP_Text)__instance.chatText).text = ""; for (int i = 0; i < __instance.ChatMessageHistory.Count; i++) { TextMeshProUGUI chatText = __instance.chatText; ((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n" + __instance.ChatMessageHistory[i]; } } AddChatMessageMain(__instance, chatMessage, nameOfUserWhoTyped); return false; } [HarmonyPatch(typeof(HUDManager), "Update")] [HarmonyPrefix] private static void Updat(HUDManager __instance) { if (File.Exists("YTTV\\other\\yt-dlp.exe") && LoadingLibrary) { DrawString(__instance, Plugin.config.GetLang().main_3.Value, "Television", "Television"); LoadingLibrary = false; } } public static async void AddChatMessageMain(HUDManager __instance, string chatMessage, string nameOfUserWhoTyped) { if (!File.Exists("YTTV\\other\\yt-dlp.exe")) { DrawString(__instance, Plugin.config.GetLang().main_1.Value, "Television", nameOfUserWhoTyped); LoadingLibrary = true; return; } string[] vs = chatMessage.Split(new char[1] { ' ' }); switch (vs[0].Replace("/", "")) { case "thelp": DrawString(__instance, Plugin.config.GetLang().main_5.Value, "Television", nameOfUserWhoTyped); break; case "tplay": if (new Regex("^https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&\\/=]*)$").IsMatch(vs[1])) { string text3 = vs[1].Remove(0, 8); if (!text3.Contains("youtube.com") && !text3.Contains("youtu.be")) { break; } if (vs[1].Contains("list")) { DrawString(__instance, Plugin.config.GetLang().main_6.Value, "Television", nameOfUserWhoTyped); break; } LoadingVideo = true; if (File.Exists("YTTV\\other\\test.mp4")) { File.Delete("YTTV\\other\\test.mp4"); } DrawString(__instance, Plugin.config.GetLang().main_7.Value, "Television", nameOfUserWhoTyped); if (isPlayTelevision) { break; } isPlayTelevision = true; await Task.Run(delegate { bool flag = false; bool flag2 = false; Process process = new Process(); process.StartInfo.FileName = "YTTV\\other\\yt-dlp.exe"; process.StartInfo.UseShellExecute = false; process.StartInfo.Arguments = "--cookies \"cookies.txt\" -f \"bv*[height<=360][ext=mp4]+ba[ext=m4a]/b[height<=360][ext=mp4]/b[ext=mp4]\" --force-ipv4 -N 4 " + vs[1] + " -o test.%(ext)s"; process.StartInfo.WorkingDirectory = "YTTV\\other"; process.StartInfo.CreateNoWindow = true; process.Start(); while (!flag) { if (flag2) { if (File.Exists("YTTV\\other\\test.mp4")) { flag = true; break; } } else if (process.HasExited) { if (File.Exists("YTTV\\other\\test.mp4.part") || File.Exists("YTTV\\other\\test.mp4")) { flag2 = true; } else if (!File.Exists("YTTV\\other\\test.mp4")) { DrawString(__instance, Plugin.config.GetLang().main_11.Value, "Television", nameOfUserWhoTyped); break; } } Thread.Sleep(1000); } }); if (!File.Exists("YTTV\\other\\test.mp4")) { LoadingVideo = false; break; } if (tvScript.tvOn) { tvScript.tvOn = false; SetTVScreenMaterial(tvScript, on: false); tvScript.tvSFX.Stop(); tvScript.video.Stop(); tvScript.tvSFX.PlayOneShot(tvScript.switchTVOff); WalkieTalkie.TransmitOneShotAudio(tvScript.tvSFX, tvScript.switchTVOff, 1f); } tvScript.video.url = "file:///" + Paths.GameRootPath + "\\YTTV\\other\\test.mp4"; tvScript.video.controlledAudioTrackCount = 1; tvScript.video.audioOutputMode = (VideoAudioOutputMode)1; tvScript.video.SetTargetAudioSource((ushort)0, tvScript.tvSFX); tvScript.video.Stop(); tvScript.tvSFX.Stop(); LoadingVideo = false; isPlayTelevision = false; positionTime = 0.0; DrawString(__instance, Plugin.config.GetLang().main_8.Value, "Television", nameOfUserWhoTyped); } else { DrawString(__instance, Plugin.config.GetLang().main_6.Value, "Television", nameOfUserWhoTyped); } break; case "ttime": { string[] array = vs[1].Split(new char[1] { ':' }); switch (array.Length) { case 2: if (tvScript.tvOn) { int num2 = Convert.ToInt32(array[0]); int num3 = Convert.ToInt32(array[1]); if (num2 == 0) { tvScript.video.time = num3; DrawString(__instance, Plugin.config.GetLang().main_12.Value.Replace("@1", $"00:00:{num3:00}"), "Television", nameOfUserWhoTyped); } else { tvScript.video.time = num2 * 60 + num3; DrawString(__instance, Plugin.config.GetLang().main_12.Value.Replace("@1", $"00:{num2:00}:{num3:00}"), "Television", nameOfUserWhoTyped); } } break; case 3: if (tvScript.tvOn) { int num4 = Convert.ToInt32(array[0]); int num5 = Convert.ToInt32(array[1]); int num6 = Convert.ToInt32(array[2]); tvScript.video.time = num4 * 3600 + num5 * 60 + num6; DrawString(__instance, Plugin.config.GetLang().main_12.Value.Replace("@1", $"{num4:00}:{num5:00}:{num6:00}"), "Television", nameOfUserWhoTyped); } break; } break; } case "tposition": { if (vs[1].ToLower() == "true") { positionSafe = true; } if (vs[1].ToLower() == "false") { positionSafe = false; } string text2 = (positionSafe ? "enabled" : "disabled"); DrawString(__instance, Plugin.config.GetLang().main_13.Value.Replace("@1", text2), "Television", nameOfUserWhoTyped); break; } case "treset": if (tvScript.tvOn) { tvScript.video.time = 0.0; DrawString(__instance, Plugin.config.GetLang().main_12.Value.Replace("@1", "00:00:00"), "Television", nameOfUserWhoTyped); } break; case "tvolume": if (nameOfUserWhoTyped == GameNetworkManager.Instance.localPlayerController.playerUsername) { float volume = tvScript.tvSFX.volume; float num = (float)(Convert.ToInt32(vs[1]) / 10) * 0.1f; if (volume != num) { tvScript.tvSFX.volume = num; volumeMain = num; ChangeVolume(new StreamWriter("YTTV\\cache")); DrawString(__instance, Plugin.config.GetLang().main_9.Value.Replace("@1", nameOfUserWhoTyped ?? "").Replace("@2", vs[1] + "%"), "Television", nameOfUserWhoTyped); } } break; } } [HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")] [HarmonyPrefix] private static bool SubmitChat_performed(HUDManager __instance, ref CallbackContext context) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) if (!LoadingVideo) { __instance.localPlayer = GameNetworkManager.Instance.localPlayerController; CallbackContext val = context; CallbackContext val2 = val; if (((CallbackContext)(ref val2)).performed && !((Object)(object)__instance.localPlayer == (Object)null) && __instance.localPlayer.isTypingChat && ((((NetworkBehaviour)__instance.localPlayer).IsOwner && (!((NetworkBehaviour)__instance).IsServer || __instance.localPlayer.isHostPlayerObject)) || __instance.localPlayer.isTestingPlayer) && !__instance.localPlayer.isPlayerDead) { if (!string.IsNullOrEmpty(__instance.chatTextField.text) && __instance.chatTextField.text.Length < 200) { __instance.AddTextToChatOnServer(__instance.chatTextField.text, (int)__instance.localPlayer.playerClientId); } for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++) { if (StartOfRound.Instance.allPlayerScripts[i].isPlayerControlled && Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, ((Component)StartOfRound.Instance.allPlayerScripts[i]).transform.position) > 24.4f && (!GameNetworkManager.Instance.localPlayerController.holdingWalkieTalkie || !StartOfRound.Instance.allPlayerScripts[i].holdingWalkieTalkie)) { __instance.playerCouldRecieveTextChatAnimator.SetTrigger("ping"); break; } } __instance.localPlayer.isTypingChat = false; __instance.chatTextField.text = ""; EventSystem.current.SetSelectedGameObject((GameObject)null); __instance.PingHUDElement(__instance.Chat, 2f, 1f, 0.2f); ((Behaviour)__instance.typingIndicator).enabled = false; return false; } } return false; } public static void DrawString(HUDManager __instance, string chatMessage, string nameOfUserWhoTyped, string name) { if (!(LastMessage == chatMessage)) { LastMessage = chatMessage; LastnameOfUserWhoTyped = name; __instance.PingHUDElement(__instance.Chat, 4f, 1f, 0.2f); if (__instance.ChatMessageHistory.Count >= 4) { ((TMP_Text)__instance.chatText).text.Remove(0, __instance.ChatMessageHistory[0].Length); __instance.ChatMessageHistory.Remove(__instance.ChatMessageHistory[0]); } StringBuilder stringBuilder = new StringBuilder(chatMessage); stringBuilder.Replace("[playerNum0]", StartOfRound.Instance.allPlayerScripts[0].playerUsername); stringBuilder.Replace("[playerNum1]", StartOfRound.Instance.allPlayerScripts[1].playerUsername); stringBuilder.Replace("[playerNum2]", StartOfRound.Instance.allPlayerScripts[2].playerUsername); stringBuilder.Replace("[playerNum3]", StartOfRound.Instance.allPlayerScripts[3].playerUsername); chatMessage = stringBuilder.ToString(); string item = ((!string.IsNullOrEmpty(nameOfUserWhoTyped)) ? ("<color=#FF0000>" + nameOfUserWhoTyped + "</color>: <color=#FFFF00>'" + chatMessage + "'</color>") : ("<color=#7069ff>" + chatMessage + "</color>")); __instance.ChatMessageHistory.Add(item); ((TMP_Text)__instance.chatText).text = ""; for (int i = 0; i < __instance.ChatMessageHistory.Count; i++) { TextMeshProUGUI chatText = __instance.chatText; ((TMP_Text)chatText).text = ((TMP_Text)chatText).text + "\n" + __instance.ChatMessageHistory[i]; } } } [HarmonyPatch(typeof(HUDManager), "Start")] [HarmonyPostfix] private static void StartPostfix(HUDManager __instance) { __instance.chatTextField.characterLimit = 200; } [HarmonyPatch(typeof(TVScript), "TurnTVOnOff")] [HarmonyPrefix] public static bool TurnTVOnOff(TVScript __instance, bool on) { __instance.tvOn = on; if (on) { if (positionSafe) { tvScript.video.time = positionTime; } SetTVScreenMaterial(__instance, on: true); __instance.video.Play(); __instance.tvSFX.Play(); __instance.tvSFX.PlayOneShot(__instance.switchTVOn); WalkieTalkie.TransmitOneShotAudio(__instance.tvSFX, __instance.switchTVOn, 1f); } else { if (positionSafe) { positionTime = tvScript.video.time; } SetTVScreenMaterial(__instance, on: false); __instance.tvSFX.Stop(); __instance.video.Stop(); __instance.tvSFX.PlayOneShot(__instance.switchTVOff); WalkieTalkie.TransmitOneShotAudio(__instance.tvSFX, __instance.switchTVOff, 1f); } return false; } public static void SetTVScreenMaterial(TVScript __instance, bool on) { Material[] sharedMaterials = ((Renderer)__instance.tvMesh).sharedMaterials; if (on) { sharedMaterials[1] = __instance.tvOnMaterial; } else { sharedMaterials[1] = __instance.tvOffMaterial; } ((Renderer)__instance.tvMesh).sharedMaterials = sharedMaterials; ((Behaviour)__instance.tvLight).enabled = on; } [HarmonyPatch(typeof(TVScript), "TVFinishedClip")] [HarmonyPrefix] public static bool TVFinishedClip() { return false; } [HarmonyPatch(typeof(TVScript), "Update")] [HarmonyPrefix] public static bool Update() { curretTime = tvScript.video.time; totalTime = tvScript.video.length; return false; } [HarmonyPatch(typeof(TVScript), "OnEnable")] [HarmonyPrefix] public static bool Prefix(TVScript __instance) { tvScript = __instance; __instance.video.clip = null; __instance.tvSFX.clip = null; if (File.Exists("YTTV\\cache")) { using StreamReader streamReader = new StreamReader("YTTV\\cache"); string value; while ((value = streamReader.ReadLine()) != null) { __instance.tvSFX.volume = Convert.ToSingle(value); } } else { __instance.tvSFX.volume = 0.5f; } __instance.video.Stop(); __instance.tvSFX.Stop(); return false; } } } namespace YTTV { public static class PluginInfo { public const string PLUGIN_GUID = "MARMods.YTTV"; public const string PLUGIN_NAME = "YTTV"; public const string PLUGIN_VERSION = "1.1.2"; } }