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 XiaohaiTV v1.0.4
REPO_TV.dll
Decompiled 4 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Newtonsoft.Json.Linq; using Photon.Pun; using REPOLib.Modules; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("REPO_TV")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("SOSRY7C6PMFEVJP")] [assembly: AssemblyProduct("REPO_TV")] [assembly: AssemblyCopyright("Copyright © SOSRY7C6PMFEVJP 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("a03cea98-efc0-455e-a11b-780d04619db8")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] public static class BiliBili { private static readonly int[] mixinKeyEncTab; private static readonly HttpClient client; private static string wbiImgKey; private static string wbiSubKey; private static DateTime wbiCacheTime; static BiliBili() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown mixinKeyEncTab = new int[64] { 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52 }; HttpClientHandler val = new HttpClientHandler(); val.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; val.AllowAutoRedirect = false; client = new HttpClient((HttpMessageHandler)(object)val); client.Timeout = TimeSpan.FromSeconds(10.0); wbiImgKey = null; wbiSubKey = null; wbiCacheTime = DateTime.MinValue; } private static string GetMixinKey(string orig) { StringBuilder stringBuilder = new StringBuilder(64); int[] array = mixinKeyEncTab; foreach (int index in array) { stringBuilder.Append(orig[index]); } return stringBuilder.ToString(0, Math.Min(32, stringBuilder.Length)); } private static Dictionary<string, string> EncWbi(Dictionary<string, string> parameters, string imgKey, string subKey) { string mixinKey = GetMixinKey(imgKey + subKey); string value = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(); SortedDictionary<string, string> sortedDictionary = new SortedDictionary<string, string>(parameters); sortedDictionary["wts"] = value; Dictionary<string, string> dictionary = sortedDictionary.ToDictionary((KeyValuePair<string, string> p) => p.Key, (KeyValuePair<string, string> p) => new string(p.Value.Where((char ch) => !Enumerable.Contains("!'()*", ch)).ToArray())); string text = string.Join("&", dictionary.Select((KeyValuePair<string, string> p) => Uri.EscapeDataString(p.Key) + "=" + Uri.EscapeDataString(p.Value))); byte[] array; using (MD5 mD = MD5.Create()) { array = mD.ComputeHash(Encoding.UTF8.GetBytes(text + mixinKey)); } string value2 = BitConverter.ToString(array).Replace("-", "").ToLowerInvariant(); dictionary["w_rid"] = value2; return dictionary; } private static async Task<string> HttpGetAsync(string url, Dictionary<string, string> parameters, string sessdata) { string qs = ((parameters == null || parameters.Count == 0) ? "" : string.Join("&", parameters.Select((KeyValuePair<string, string> p) => Uri.EscapeDataString(p.Key) + "=" + Uri.EscapeDataString(p.Value)))); string full = (string.IsNullOrEmpty(qs) ? url : (url.Contains("?") ? (url + "&" + qs) : (url + "?" + qs))); HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, full); ((HttpHeaders)req.Headers).TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0 Safari/537.36"); ((HttpHeaders)req.Headers).TryAddWithoutValidation("Referer", "https://www.bilibili.com/"); if (!string.IsNullOrEmpty(sessdata)) { ((HttpHeaders)req.Headers).TryAddWithoutValidation("Cookie", "SESSDATA=" + sessdata); } HttpResponseMessage resp = await client.SendAsync(req); resp.EnsureSuccessStatusCode(); return await resp.Content.ReadAsStringAsync(); } private static async Task<(string imgKey, string subKey)> GetWbiKeysAsync(string sessdata) { if (!string.IsNullOrEmpty(wbiImgKey) && !string.IsNullOrEmpty(wbiSubKey) && DateTime.UtcNow - wbiCacheTime < TimeSpan.FromMinutes(10.0)) { return (wbiImgKey, wbiSubKey); } JObject root = JObject.Parse(await HttpGetAsync("https://api.bilibili.com/x/web-interface/nav", null, sessdata)); JToken data = root["data"]; string imgUrl = (string)data[(object)"wbi_img"][(object)"img_url"]; string subUrl = (string)data[(object)"wbi_img"][(object)"sub_url"]; string imgKey = imgUrl.Split(new char[1] { '/' }).Last().Split(new char[1] { '.' })[0]; string subKey = subUrl.Split(new char[1] { '/' }).Last().Split(new char[1] { '.' })[0]; wbiCacheTime = DateTime.UtcNow; wbiImgKey = imgKey; wbiSubKey = subKey; return (imgKey, subKey); } private static async Task<long> GetCidAsync(string bvid, string sessdata, string imgKey, string subKey) { Dictionary<string, string> signed = EncWbi(new Dictionary<string, string> { { "bvid", bvid } }, imgKey, subKey); JObject root = JObject.Parse(await HttpGetAsync("https://api.bilibili.com/x/web-interface/wbi/view", signed, sessdata)); if ((int)root["code"] != 0) { throw new Exception("view接口错误: " + (string)root["message"]); } JToken data = root["data"]; JToken obj = data[(object)"pages"]; JArray pages = (JArray)(object)((obj is JArray) ? obj : null); if (pages != null && ((JContainer)pages).Count > 0) { return (long)pages[0][(object)"cid"]; } return (long)data[(object)"cid"]; } private static async Task<JObject> GetPlayurlAsync(string bvid, long cid, string sessdata, string imgKey, string subKey, int fnval, int? qn, bool html5 = true) { Dictionary<string, string> baseParams = new Dictionary<string, string> { { "bvid", bvid }, { "cid", cid.ToString() }, { "fnval", fnval.ToString() }, { "fnver", "0" }, { "fourk", "1" }, { "platform", html5 ? "html5" : "web" } }; if (qn.HasValue) { baseParams["qn"] = qn.Value.ToString(); } Dictionary<string, string> signed = EncWbi(baseParams, imgKey, subKey); return JObject.Parse(await HttpGetAsync("https://api.bilibili.com/x/player/wbi/playurl", signed, sessdata)); } private static string TakeUrlFromDurlNewtonsoft(JToken data) { JToken obj = data[(object)"durl"]; JArray val = (JArray)(object)((obj is JArray) ? obj : null); if (val != null && ((JContainer)val).Count > 0) { foreach (JToken item in val) { string text = (string)item[(object)"url"]; if (!string.IsNullOrEmpty(text)) { return text; } JToken obj2 = item[(object)"backup_url"]; JArray val2 = (JArray)(object)((obj2 is JArray) ? obj2 : null); if (val2 == null || ((JContainer)val2).Count <= 0) { continue; } foreach (JToken item2 in val2) { string text2 = (string)item2; if (!string.IsNullOrEmpty(text2)) { return text2; } } } } return string.Empty; } public static string GetBiliBiliUrl(string bvid, int qn, string SSESDATA = "") { try { string sessdata = SSESDATA ?? ""; (string, string) result = GetWbiKeysAsync(sessdata).GetAwaiter().GetResult(); long result2 = GetCidAsync(bvid, sessdata, result.Item1, result.Item2).GetAwaiter().GetResult(); JObject result3 = GetPlayurlAsync(bvid, result2, sessdata, result.Item1, result.Item2, 1, qn).GetAwaiter().GetResult(); JToken val = result3["data"]; if (val != null) { string text = (((string)val[(object)"format"]) ?? "").ToLowerInvariant(); if (text.Contains("mp4")) { string text2 = TakeUrlFromDurlNewtonsoft(val); if (!string.IsNullOrEmpty(text2)) { return text2; } } } JObject result4 = GetPlayurlAsync(bvid, result2, sessdata, result.Item1, result.Item2, 1, null).GetAwaiter().GetResult(); JToken val2 = result4["data"]; if (val2 != null) { string text3 = (((string)val2[(object)"format"]) ?? "").ToLowerInvariant(); if (text3.Contains("mp4")) { string text4 = TakeUrlFromDurlNewtonsoft(val2); if (!string.IsNullOrEmpty(text4)) { return text4; } } } JObject result5 = GetPlayurlAsync(bvid, result2, sessdata, result.Item1, result.Item2, 0, qn, html5: false).GetAwaiter().GetResult(); JToken val3 = result5["data"]; if (val3 != null) { string text5 = (((string)val3[(object)"format"]) ?? "").ToLowerInvariant(); if (text5.Contains("flv")) { string text6 = TakeUrlFromDurlNewtonsoft(val3); if (!string.IsNullOrEmpty(text6)) { return text6; } } } JObject result6 = GetPlayurlAsync(bvid, result2, sessdata, result.Item1, result.Item2, 0, null, html5: false).GetAwaiter().GetResult(); JToken val4 = result6["data"]; if (val4 != null) { string text7 = (((string)val4[(object)"format"]) ?? "").ToLowerInvariant(); if (text7.Contains("flv")) { string text8 = TakeUrlFromDurlNewtonsoft(val4); if (!string.IsNullOrEmpty(text8)) { return text8; } } } return string.Empty; } catch { return string.Empty; } } public static async Task<string> GetBiliBiliUrlAsync(string bvid, int qn, string SSESDATA = "") { try { string sess = SSESDATA ?? ""; (string imgKey, string subKey) keys = await GetWbiKeysAsync(sess); long cid = await GetCidAsync(bvid, sess, keys.imgKey, keys.subKey); JToken data3 = (await GetPlayurlAsync(bvid, cid, sess, keys.imgKey, keys.subKey, 1, qn))["data"]; if (data3 != null) { string format4 = (((string)data3[(object)"format"]) ?? "").ToLowerInvariant(); if (format4.Contains("mp4")) { string url4 = TakeUrlFromDurlNewtonsoft(data3); if (!string.IsNullOrEmpty(url4)) { return url4; } } } JToken data4 = (await GetPlayurlAsync(bvid, cid, sess, keys.imgKey, keys.subKey, 1, null))["data"]; if (data4 != null) { string format3 = (((string)data4[(object)"format"]) ?? "").ToLowerInvariant(); if (format3.Contains("mp4")) { string url3 = TakeUrlFromDurlNewtonsoft(data4); if (!string.IsNullOrEmpty(url3)) { return url3; } } } JToken data2 = (await GetPlayurlAsync(bvid, cid, sess, keys.imgKey, keys.subKey, 0, qn, html5: false))["data"]; if (data2 != null) { string format2 = (((string)data2[(object)"format"]) ?? "").ToLowerInvariant(); if (format2.Contains("flv")) { string url2 = TakeUrlFromDurlNewtonsoft(data2); if (!string.IsNullOrEmpty(url2)) { return url2; } } } JToken data = (await GetPlayurlAsync(bvid, cid, sess, keys.imgKey, keys.subKey, 0, null, html5: false))["data"]; if (data != null) { string format = (((string)data[(object)"format"]) ?? "").ToLowerInvariant(); if (format.Contains("flv")) { string url = TakeUrlFromDurlNewtonsoft(data); if (!string.IsNullOrEmpty(url)) { return url; } } } return string.Empty; } catch { return string.Empty; } } public static string GetBiliBiliUrl(string bvid) { return GetBiliBiliUrl(bvid, 64); } public static Task<string> GetBiliBiliUrlAsync(string bvid) { return GetBiliBiliUrlAsync(bvid, 64); } public static string GetVedioName(string BVID, string SSESDATA = "") { try { string sessdata = SSESDATA ?? ""; (string, string) result = GetWbiKeysAsync(sessdata).GetAwaiter().GetResult(); Dictionary<string, string> parameters = EncWbi(new Dictionary<string, string> { { "bvid", BVID } }, result.Item1, result.Item2); string result2 = HttpGetAsync("https://api.bilibili.com/x/web-interface/wbi/view", parameters, sessdata).GetAwaiter().GetResult(); JObject val = JObject.Parse(result2); if ((int)val["code"] != 0) { return string.Empty; } JToken val2 = val["data"]; JToken val3 = ((val2 != null) ? val2[(object)"title"] : null); return (val3 != null) ? ((string)val3) : string.Empty; } catch { return string.Empty; } } } namespace REPO_TV; [BepInPlugin("com.xiaohai.REPO_TV", "REPO_TV", "1.0.4")] public class Plugin : BaseUnityPlugin { public const string PLUGIN_GUID = "com.xiaohai.REPO_TV"; public const string PLUGIN_NAME = "REPO_TV"; public const string PLUGIN_VERSION = "1.0.4"; public static Plugin instance; public static ManualLogSource logger; public AudioClip pressing; public GameObject TvPrefab; private void Awake() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) instance = this; logger = ((BaseUnityPlugin)this).Logger; logger.LogInfo((object)"Plugin REPO_TV is loaded!"); LoadAB(); new Harmony("com.xiaohai.REPO_TV").PatchAll(); } private void LoadAB() { string location = Assembly.GetExecutingAssembly().Location; string directoryName = Path.GetDirectoryName(location); string text = Path.Combine(directoryName, "xiaohaitv"); AssetBundle val = AssetBundle.LoadFromFile(text); pressing = val.LoadAsset<AudioClip>("pressing.wav"); TvPrefab = val.LoadAsset<GameObject>("TV.prefab"); if ((Object)(object)TvPrefab != (Object)null) { TvPrefab.AddComponent<TVScript>(); TvPrefab.AddComponent<TVButtonManager>(); logger.LogInfo((object)"TV Prefab 加载成功."); NetworkPrefabs.RegisterNetworkPrefab(TvPrefab); Utilities.FixAudioMixerGroups(TvPrefab); } else { logger.LogError((object)"电视机预制体加载失败."); } } } [HarmonyPatch] public static class Patch { [HarmonyPatch(typeof(LevelGenerator))] public class LevelGeneratorPatch { [HarmonyPatch("GenerateDone")] [HarmonyPostfix] private static void AfterLevelGenerated(LevelGenerator __instance) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) if (!ShouldRunCustomLogic() || !SemiFunc.IsMasterClientOrSingleplayer()) { return; } Plugin.logger.LogInfo((object)"在关卡生成后放置电视机."); GameObject val = GameObject.Find("cctv"); if ((Object)(object)val != (Object)null) { Plugin.logger.LogInfo((object)"cctv不为空!."); if (SemiFunc.IsMultiplayer()) { GameObject val2 = PhotonNetwork.InstantiateRoomObject(((Object)Plugin.instance.TvPrefab).name, Vector3.zero, Quaternion.identity, (byte)0, (object[])null); } else { GameObject val2 = Object.Instantiate<GameObject>(Plugin.instance.TvPrefab, Vector3.zero, Quaternion.identity); } } } private static bool ShouldRunCustomLogic() { RunManager instance = RunManager.instance; return (Object)(object)instance != (Object)null && instance.levels.Contains(instance.levelCurrent) && (Object)(object)instance.levelCurrent != (Object)(object)instance.levelTutorial && (Object)(object)instance.levelCurrent != (Object)(object)instance.levelShop && (Object)(object)instance.levelCurrent != (Object)(object)instance.levelLobbyMenu; } } } public class TVButtonManager : MonoBehaviour { private enum BtnType { None, Switch, Play, Next, VolumeUp, VolumeDown } private class Btn { public StaticGrabObject sgo; public BtnType type; public float timer; public bool pressedLast; public bool fired; public Image ring; public bool soundStarted; public AudioSource audio; public float threshold; } [SerializeField] private Transform root; [SerializeField] private float holdTime = 2f; [SerializeField] private bool debugLog = true; private TVScript tv; private Sound pressingSound; private AudioClip pressingClip; private readonly List<Btn> buttons = new List<Btn>(); private void Awake() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown tv = ((Component)this).GetComponent<TVScript>(); if ((Object)(object)tv == (Object)null) { tv = ((Component)this).GetComponentInParent<TVScript>(); } PhysGrabObjectImpactDetector component = ((Component)this).GetComponent<PhysGrabObjectImpactDetector>(); if ((Object)(object)component != (Object)null) { UnityEvent onAllBreaks = component.onAllBreaks; if (onAllBreaks != null) { onAllBreaks.AddListener((UnityAction)delegate { if (Object.op_Implicit((Object)(object)tv)) { tv.Switch(); } }); } } root = (Object.op_Implicit((Object)(object)root) ? root : ((Component)this).transform); pressingClip = Plugin.instance?.pressing; if (debugLog) { Debug.Log((object)"[TVButtonManager(Mod)] Awake"); } StaticGrabObject[] componentsInChildren = ((Component)root).GetComponentsInChildren<StaticGrabObject>(true); foreach (StaticGrabObject val in componentsInChildren) { BtnType btnType = Classify(((Object)val).name); if (btnType != 0) { Image ring = null; Transform val2 = ((Component)val).transform.Find("Ring"); if (Object.op_Implicit((Object)(object)val2)) { ring = ((Component)val2).GetComponent<Image>(); } float threshold = ((btnType == BtnType.VolumeUp || btnType == BtnType.VolumeDown) ? 1f : holdTime); buttons.Add(new Btn { sgo = val, type = btnType, timer = 0f, pressedLast = false, fired = false, ring = ring, soundStarted = false, threshold = threshold }); if (debugLog) { Debug.Log((object)("[TVButtonManager(Mod)] Button: " + ((Object)val).name + " -> " + btnType)); } } } } private void Update() { //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Expected O, but got Unknown //IL_0250: Unknown result type (might be due to invalid IL or missing references) Btn btn = null; foreach (Btn button in buttons) { if (Object.op_Implicit((Object)(object)button.sgo) && button.sgo.grabbed && (!SemiFunc.IsMasterClientOrSingleplayer() || button.sgo.playerGrabbing.Count > 0)) { btn = button; break; } } foreach (Btn button2 in buttons) { if (btn != null && button2 != btn && Object.op_Implicit((Object)(object)button2.sgo)) { if (((Behaviour)button2.sgo).enabled) { ((Behaviour)button2.sgo).enabled = false; } } else if (Object.op_Implicit((Object)(object)button2.sgo) && !((Behaviour)button2.sgo).enabled) { ((Behaviour)button2.sgo).enabled = true; } } foreach (Btn button3 in buttons) { bool flag = Object.op_Implicit((Object)(object)button3.sgo) && button3.sgo.grabbed && (!SemiFunc.IsMasterClientOrSingleplayer() || button3.sgo.playerGrabbing.Count > 0); if (flag) { if (!button3.pressedLast) { button3.timer = 0f; button3.fired = false; button3.soundStarted = false; if (Object.op_Implicit((Object)(object)button3.ring)) { button3.ring.fillAmount = 0f; } } if (!button3.fired) { button3.timer += Time.deltaTime; } if (!button3.soundStarted && Object.op_Implicit((Object)(object)pressingClip)) { if (pressingSound == null) { pressingSound = new Sound(); pressingSound.Type = (AudioType)6; pressingSound.SpatialBlend = 1f; pressingSound.Volume = 1f; pressingSound.Pitch = 1f; } pressingSound.Sounds = (AudioClip[])(object)new AudioClip[1] { pressingClip }; pressingSound.Source = null; button3.audio = pressingSound.Play(((Component)button3.sgo).transform.position, 1f, 1f, 1f, 1f); button3.soundStarted = true; } if (!button3.fired && button3.timer >= button3.threshold) { Fire(button3.type); button3.fired = true; button3.timer = 0f; } if (Object.op_Implicit((Object)(object)button3.ring)) { button3.ring.fillAmount = (button3.fired ? 0f : Mathf.Clamp01(button3.timer / button3.threshold)); } } else { button3.timer = 0f; button3.fired = false; button3.soundStarted = false; if (Object.op_Implicit((Object)(object)button3.ring)) { button3.ring.fillAmount = 0f; } if (Object.op_Implicit((Object)(object)button3.audio)) { if (button3.audio.isPlaying) { button3.audio.Stop(); } if (Object.op_Implicit((Object)(object)button3.audio)) { Object.Destroy((Object)(object)((Component)button3.audio).gameObject); } button3.audio = null; } } button3.pressedLast = flag; } } private void Fire(BtnType type) { if (Object.op_Implicit((Object)(object)tv)) { switch (type) { case BtnType.Switch: tv.Switch(); break; case BtnType.Play: tv.Play(); break; case BtnType.Next: tv.Next(); break; case BtnType.VolumeUp: tv.VolumeUp(); break; case BtnType.VolumeDown: tv.VolumeDown(); break; } } } private BtnType Classify(string name) { string text = name.ToLowerInvariant(); if (text.Contains("switch") || text.Contains("开关") || text.Contains("电源")) { return BtnType.Switch; } if (text.Contains("play") || text.Contains("播放") || text.Contains("暂停")) { return BtnType.Play; } if (text.Contains("next") || text.Contains("下一")) { return BtnType.Next; } if (text.Contains("volumeup") || text.Contains("音量+") || (text.Contains("volume") && (text.Contains("up") || text.Contains("+") || text.Contains("increase") || text.Contains("加")))) { return BtnType.VolumeUp; } if (text.Contains("volumedown") || text.Contains("音量-") || (text.Contains("volume") && (text.Contains("down") || text.Contains("-") || text.Contains("decrease") || text.Contains("减")))) { return BtnType.VolumeDown; } return BtnType.None; } } public class TVScript : MonoBehaviourPun { private class PlaylistItem { public string url; public bool isLocal; public string name; } [CompilerGenerated] private sealed class <>c__DisplayClass34_0 { public string bv; internal string <PlayBilibiliCoroutine>b__0() { return BiliBili.GetVedioName(bv); } } [CompilerGenerated] private sealed class <PlayBilibiliCoroutine>d__34 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public string bv; public TVScript <>4__this; private <>c__DisplayClass34_0 <>8__1; private Task<string> <task>5__2; private string <videoUrl>5__3; private Task<string> <nameTask>5__4; private string <videoName>5__5; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PlayBilibiliCoroutine>d__34(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; <task>5__2 = null; <videoUrl>5__3 = null; <nameTask>5__4 = null; <videoName>5__5 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass34_0(); <>8__1.bv = bv; <>4__this.bilibiliReturnInfo = ""; <task>5__2 = BiliBili.GetBiliBiliUrlAsync(<>8__1.bv); goto IL_0089; case 1: <>1__state = -1; goto IL_0089; case 2: { <>1__state = -1; break; } IL_0089: if (!<task>5__2.IsCompleted) { <>2__current = null; <>1__state = 1; return true; } <videoUrl>5__3 = <task>5__2.Result; <nameTask>5__4 = Task.Run(() => BiliBili.GetVedioName(<>8__1.bv)); break; } if (!<nameTask>5__4.IsCompleted) { <>2__current = null; <>1__state = 2; return true; } <videoName>5__5 = (string.IsNullOrEmpty(<nameTask>5__4.Result) ? <>8__1.bv : <nameTask>5__4.Result); if (!string.IsNullOrEmpty(<videoUrl>5__3)) { if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)<>4__this).photonView.RPC("RPC_AddPlaylistItem", (RpcTarget)3, new object[3] { <videoUrl>5__3, <videoName>5__5, true }); } else { <>4__this.RPC_AddPlaylistItem(<videoUrl>5__3, <videoName>5__5, playImmediately: true); } <>4__this.bilibiliReturnInfo = "视频播放成功!"; } else { <>4__this.bilibiliReturnInfo = "获取视频链接失败!"; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private readonly List<string> videoFilePaths = new List<string>(); private bool videosLoaded = false; private readonly List<PlaylistItem> playlist = new List<PlaylistItem>(); private MeshRenderer meshRenderer; private AudioSource audioSource; private VideoPlayer videoPlayer; private Light tvLight; private GameObject volumeRoot; private Image volumeFill; private float volumeUITimer; private RenderTexture renderTexture; private Texture originalTexture; private Color originalColor; private Vector2 originalOffset; private Vector2 originalScale; private int materialIndex = 2; private Texture originalEmissionMap; private Color originalEmissionColor; private bool originalEmissionEnabled; private int currentIndex; private int lastIndex; private bool powered; private bool playing; private bool showBilibiliWindow; private string bvInput; private string bilibiliReturnInfo; private Rect bilibiliWindowRect = new Rect(100f, 100f, 420f, 420f); private Vector2 playlistScroll; private void Awake() { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_0324: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_0362: Unknown result type (might be due to invalid IL or missing references) //IL_0367: Unknown result type (might be due to invalid IL or missing references) //IL_03e5: Unknown result type (might be due to invalid IL or missing references) //IL_03ef: Expected O, but got Unknown GameObject gameObject = ((Component)this).gameObject; GameObject val = GameObject.Find("cctv"); if ((Object)(object)gameObject != (Object)null && (Object)(object)val != (Object)null) { Plugin.logger.LogInfo((object)"tv不为空!."); gameObject.transform.SetParent(val.transform, false); gameObject.transform.localPosition = new Vector3(2.22f, -1.18f, -0.84f); gameObject.transform.localRotation = Quaternion.identity; gameObject.transform.localScale = Vector3.one; } Transform val2 = ((Component)this).transform.Find("TVMesh"); if (Object.op_Implicit((Object)(object)val2)) { meshRenderer = ((Component)val2).GetComponentInChildren<MeshRenderer>(); } if (!Object.op_Implicit((Object)(object)meshRenderer)) { meshRenderer = ((Component)this).GetComponentInChildren<MeshRenderer>(); } Transform val3 = ((Component)this).transform.Find("Audio"); if (Object.op_Implicit((Object)(object)val3)) { audioSource = ((Component)val3).GetComponentInChildren<AudioSource>(); } if (!Object.op_Implicit((Object)(object)audioSource)) { audioSource = ((Component)this).GetComponentInChildren<AudioSource>(); } Transform val4 = ((Component)this).transform.Find("Video"); if (Object.op_Implicit((Object)(object)val4)) { videoPlayer = ((Component)val4).GetComponentInChildren<VideoPlayer>(); } if (!Object.op_Implicit((Object)(object)videoPlayer)) { videoPlayer = ((Component)this).GetComponentInChildren<VideoPlayer>(); } Transform val5 = ((Component)this).transform.Find("Light"); if (Object.op_Implicit((Object)(object)val5)) { tvLight = ((Component)val5).GetComponent<Light>(); } if (!Object.op_Implicit((Object)(object)tvLight)) { tvLight = ((Component)this).GetComponentInChildren<Light>(); } Transform val6 = ((Component)this).transform.Find("Canvas/Controller"); if (Object.op_Implicit((Object)(object)val6)) { val6.localPosition = new Vector3(-1.889f, -0.612f, -0.006f); } Transform val7 = ((Component)this).transform.Find("Canvas/Volume"); if (Object.op_Implicit((Object)(object)val7)) { volumeRoot = ((Component)val7).gameObject; Transform val8 = val7.Find("BG/Fill"); if (Object.op_Implicit((Object)(object)val8)) { volumeFill = ((Component)val8).GetComponent<Image>(); } if (Object.op_Implicit((Object)(object)volumeFill)) { volumeFill.type = (Type)3; volumeFill.fillMethod = (FillMethod)1; volumeFill.fillOrigin = 0; volumeFill.fillAmount = (Object.op_Implicit((Object)(object)audioSource) ? Mathf.Clamp01(audioSource.volume) : 0f); } volumeRoot.SetActive(false); } if (Object.op_Implicit((Object)(object)meshRenderer) && materialIndex >= 0 && materialIndex < ((Renderer)meshRenderer).materials.Length) { Material val9 = ((Renderer)meshRenderer).materials[materialIndex]; originalTexture = val9.mainTexture; originalColor = val9.color; originalOffset = val9.mainTextureOffset; originalScale = val9.mainTextureScale; if (val9.HasProperty("_EmissionColor")) { originalEmissionColor = val9.GetColor("_EmissionColor"); } if (val9.HasProperty("_EmissionMap")) { originalEmissionMap = val9.GetTexture("_EmissionMap"); } originalEmissionEnabled = val9.IsKeywordEnabled("_EMISSION"); } if (Object.op_Implicit((Object)(object)videoPlayer)) { videoPlayer.renderMode = (VideoRenderMode)2; if (!Object.op_Implicit((Object)(object)renderTexture)) { renderTexture = new RenderTexture(1920, 1080, 0); } videoPlayer.targetTexture = renderTexture; videoPlayer.audioOutputMode = (VideoAudioOutputMode)1; if (Object.op_Implicit((Object)(object)audioSource)) { videoPlayer.EnableAudioTrack((ushort)0, true); videoPlayer.SetTargetAudioSource((ushort)0, audioSource); } videoPlayer.playOnAwake = false; videoPlayer.source = (VideoSource)1; } ReloadLocalPlaylist(); } private void Update() { if ((Input.GetKey((KeyCode)308) || Input.GetKey((KeyCode)307)) && Input.GetKeyDown((KeyCode)98) && SemiFunc.IsMasterClientOrSingleplayer()) { showBilibiliWindow = !showBilibiliWindow; Cursor.visible = showBilibiliWindow; } if (Object.op_Implicit((Object)(object)volumeRoot) && volumeRoot.activeSelf && volumeUITimer > 0f) { volumeUITimer -= Time.deltaTime; if (volumeUITimer <= 0f) { volumeRoot.SetActive(false); } } } private void OnGUI() { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.IsMasterClientOrSingleplayer() && showBilibiliWindow) { if ((Object)(object)GUI.skin != (Object)null) { GUI.skin.label.fontSize = 12; GUI.skin.button.fontSize = 12; GUI.skin.textField.fontSize = 12; } bilibiliWindowRect = GUI.Window(0, bilibiliWindowRect, new WindowFunction(DrawBilibiliWindow), "小海REPO电视机v1.0.4"); } } private void DrawBilibiliWindow(int windowID) { //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label("BV号/链接:", Array.Empty<GUILayoutOption>()); bvInput = GUILayout.TextField(bvInput ?? "", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) }); if (GUILayout.Button("播放", Array.Empty<GUILayoutOption>())) { string text = ExtractBVFromInput(bvInput); bvInput = ""; if (string.IsNullOrEmpty(text)) { bilibiliReturnInfo = "bv号获取失败,请检查输入!"; } else { ((MonoBehaviour)this).StartCoroutine(PlayBilibiliCoroutine(text)); } } if (GUILayout.Button("加载本地视频", Array.Empty<GUILayoutOption>())) { ReloadLocalPlaylist(); } GUILayout.EndHorizontal(); GUILayout.Label("返回信息: " + bilibiliReturnInfo, Array.Empty<GUILayoutOption>()); playlistScroll = GUILayout.BeginScrollView(playlistScroll, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(300f) }); for (int i = 0; i < playlist.Count; i++) { PlaylistItem playlistItem = playlist[i]; GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(i.ToString(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(30f) }); GUILayout.Label(playlistItem.name ?? "", Array.Empty<GUILayoutOption>()); if (GUILayout.Button("删除", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) }) && SemiFunc.IsMasterClientOrSingleplayer()) { if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_RemovePlaylistItem", (RpcTarget)3, new object[1] { i }); } else { RPC_RemovePlaylistItem(i); } } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); if (GUILayout.Button("关闭", Array.Empty<GUILayoutOption>())) { showBilibiliWindow = false; } GUILayout.EndVertical(); GUI.DragWindow(); } private string ExtractBVFromInput(string input) { if (string.IsNullOrEmpty(input)) { return null; } Match match = Regex.Match(input, "BV[0-9A-Za-z]{10}"); return match.Success ? match.Value : null; } [IteratorStateMachine(typeof(<PlayBilibiliCoroutine>d__34))] private IEnumerator PlayBilibiliCoroutine(string bv) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PlayBilibiliCoroutine>d__34(0) { <>4__this = this, bv = bv }; } private void VolumeUIShow() { if (powered) { if (Object.op_Implicit((Object)(object)volumeRoot)) { volumeRoot.SetActive(true); volumeUITimer = 2f; } if (Object.op_Implicit((Object)(object)volumeFill) && Object.op_Implicit((Object)(object)audioSource)) { volumeFill.fillAmount = Mathf.Clamp01(audioSource.volume); } } } private void LoadVideoFiles() { string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty; string text = Path.Combine(path, "Vedio"); string text2 = Path.Combine(path, "Video"); string path2 = (Directory.Exists(text) ? text : (Directory.Exists(text2) ? text2 : text)); if (!Directory.Exists(path2)) { Directory.CreateDirectory(path2); return; } string[] supportedExtensions = new string[5] { ".mp4", ".mov", ".webm", ".avi", ".wmv" }; List<string> list = (from file in Directory.GetFiles(path2) where supportedExtensions.Contains(Path.GetExtension(file).ToLower()) orderby file select file).ToList(); if (list.Count != 0) { videoFilePaths.Clear(); videoFilePaths.AddRange(list); videosLoaded = true; } } public void Switch() { if (SemiFunc.IsMasterClientOrSingleplayer()) { bool flag = !powered; if (!flag) { lastIndex = currentIndex; } int num = (flag ? lastIndex : currentIndex); bool flag2 = flag; if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_ApplyState", (RpcTarget)3, new object[3] { flag, flag2, num }); } else { RPC_ApplyState(flag, flag2, num); } } else { ((MonoBehaviourPun)this).photonView.RPC("RPC_Switch", (RpcTarget)2, Array.Empty<object>()); } } public void Play() { if (!powered || (Object)(object)videoPlayer == (Object)null || (Object)(object)meshRenderer == (Object)null || !videosLoaded) { return; } if (SemiFunc.IsMasterClientOrSingleplayer()) { bool flag = !playing; if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_ApplyState", (RpcTarget)3, new object[3] { powered, flag, currentIndex }); } else { RPC_ApplyState(powered, flag, currentIndex); } } else { ((MonoBehaviourPun)this).photonView.RPC("RPC_PlayToggle", (RpcTarget)2, Array.Empty<object>()); } } public void Next() { if (!powered || !videosLoaded) { return; } if (SemiFunc.IsMasterClientOrSingleplayer()) { int num = ((playlist.Count != 0) ? ((currentIndex + 1) % playlist.Count) : 0); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_ApplyState", (RpcTarget)3, new object[3] { true, true, num }); } else { RPC_ApplyState(newPowered: true, newPlaying: true, num); } } else { ((MonoBehaviourPun)this).photonView.RPC("RPC_Next", (RpcTarget)2, Array.Empty<object>()); } } public void VolumeUp() { if (!Object.op_Implicit((Object)(object)audioSource) || !powered) { return; } if (SemiFunc.IsMasterClientOrSingleplayer()) { float num = Mathf.Clamp01(audioSource.volume + 0.1f); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_SetVolume", (RpcTarget)3, new object[1] { num }); } else { RPC_SetVolume(num); } VolumeUIShow(); } else { ((MonoBehaviourPun)this).photonView.RPC("RPC_VolumeUp", (RpcTarget)2, Array.Empty<object>()); } } public void VolumeDown() { if (!Object.op_Implicit((Object)(object)audioSource) || !powered) { return; } if (SemiFunc.IsMasterClientOrSingleplayer()) { float num = Mathf.Clamp01(audioSource.volume - 0.1f); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_SetVolume", (RpcTarget)3, new object[1] { num }); } else { RPC_SetVolume(num); } VolumeUIShow(); } else { ((MonoBehaviourPun)this).photonView.RPC("RPC_VolumeDown", (RpcTarget)2, Array.Empty<object>()); } } public void PowerOn() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) powered = true; if (Object.op_Implicit((Object)(object)tvLight)) { tvLight.color = Color.blue; } if ((Object)(object)videoPlayer != (Object)null && (Object)(object)meshRenderer != (Object)null && videosLoaded) { currentIndex = lastIndex; StartPlayFromIndex(currentIndex); } } public void PowerOff() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) Stop(); powered = false; if (Object.op_Implicit((Object)(object)tvLight)) { tvLight.color = Color.red; } } public void Stop() { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)videoPlayer)) { videoPlayer.Stop(); } if (Object.op_Implicit((Object)(object)audioSource)) { audioSource.Stop(); } if (Object.op_Implicit((Object)(object)meshRenderer) && materialIndex >= 0 && materialIndex < ((Renderer)meshRenderer).materials.Length) { Material val = ((Renderer)meshRenderer).materials[materialIndex]; val.mainTexture = originalTexture; val.color = originalColor; val.mainTextureOffset = originalOffset; val.mainTextureScale = originalScale; if (originalEmissionEnabled) { val.EnableKeyword("_EMISSION"); } else { val.DisableKeyword("_EMISSION"); } if (val.HasProperty("_EmissionMap")) { val.SetTexture("_EmissionMap", originalEmissionMap); } if (val.HasProperty("_EmissionColor")) { val.SetColor("_EmissionColor", originalEmissionColor); } } playing = false; } private void StartPlayInternal(string videoUrl) { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)videoPlayer)) { videoPlayer.source = (VideoSource)1; videoPlayer.url = videoUrl; } if (Object.op_Implicit((Object)(object)meshRenderer)) { Material[] materials = ((Renderer)meshRenderer).materials; if (materialIndex >= 0 && materialIndex < materials.Length) { Material val = materials[materialIndex]; val.mainTexture = (Texture)(object)renderTexture; val.color = Color.white; val.mainTextureScale = new Vector2(1.77f, 3.18f); val.mainTextureOffset = Vector2.zero; val.globalIlluminationFlags = (MaterialGlobalIlluminationFlags)4; val.EnableKeyword("_EMISSION"); if (val.HasProperty("_EmissionMap")) { val.SetTexture("_EmissionMap", (Texture)(object)renderTexture); } if (val.HasProperty("_EmissionColor")) { val.SetColor("_EmissionColor", new Color(0.2f, 0.2f, 0.2f)); } if (val.HasProperty("_Metallic")) { val.SetFloat("_Metallic", 0f); } if (val.HasProperty("_Glossiness")) { val.SetFloat("_Glossiness", 0f); } if (val.HasProperty("_Smoothness")) { val.SetFloat("_Smoothness", 0f); } } } if (Object.op_Implicit((Object)(object)videoPlayer)) { videoPlayer.Play(); } playing = true; } private void StartPlayFromIndex(int idx) { if (videosLoaded && playlist.Count != 0) { currentIndex = Mathf.Clamp(idx, 0, playlist.Count - 1); PlaylistItem playlistItem = playlist[currentIndex]; StartPlayInternal(playlistItem.url); } } private void PauseInternal() { if (Object.op_Implicit((Object)(object)videoPlayer)) { videoPlayer.Pause(); } if (Object.op_Implicit((Object)(object)audioSource)) { audioSource.Pause(); } playing = false; } [PunRPC] private void RPC_ApplyState(bool newPowered, bool newPlaying, int newIndex) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) newIndex = Mathf.Clamp(newIndex, 0, (playlist.Count != 0) ? (playlist.Count - 1) : 0); powered = newPowered; currentIndex = newIndex; if (Object.op_Implicit((Object)(object)tvLight)) { tvLight.color = (powered ? Color.blue : Color.red); } if (!powered) { lastIndex = currentIndex; Stop(); playing = false; } else if (newPlaying) { StartPlayFromIndex(currentIndex); } else { PauseInternal(); } } [PunRPC] private void RPC_Switch() { if (SemiFunc.IsMasterClient()) { bool flag = !powered; if (!flag) { lastIndex = currentIndex; } int num = (flag ? lastIndex : currentIndex); bool flag2 = flag; ((MonoBehaviourPun)this).photonView.RPC("RPC_ApplyState", (RpcTarget)3, new object[3] { flag, flag2, num }); } } [PunRPC] private void RPC_PlayToggle() { if (SemiFunc.IsMasterClient() && powered && !((Object)(object)videoPlayer == (Object)null) && !((Object)(object)meshRenderer == (Object)null) && videosLoaded) { bool flag = !playing; ((MonoBehaviourPun)this).photonView.RPC("RPC_ApplyState", (RpcTarget)3, new object[3] { powered, flag, currentIndex }); } } [PunRPC] private void RPC_Next() { if (SemiFunc.IsMasterClient() && powered && videosLoaded) { int num = ((playlist.Count != 0) ? ((currentIndex + 1) % playlist.Count) : 0); ((MonoBehaviourPun)this).photonView.RPC("RPC_ApplyState", (RpcTarget)3, new object[3] { true, true, num }); } } [PunRPC] private void RPC_SetVolume(float v) { if (Object.op_Implicit((Object)(object)audioSource)) { audioSource.volume = Mathf.Clamp01(v); VolumeUIShow(); } } [PunRPC] private void RPC_SetBilibiliVideoUrl(string videoUrl) { } [PunRPC] private void RPC_VolumeUp() { if (SemiFunc.IsMasterClient() && Object.op_Implicit((Object)(object)audioSource)) { float num = Mathf.Clamp01(audioSource.volume + 0.1f); ((MonoBehaviourPun)this).photonView.RPC("RPC_SetVolume", (RpcTarget)3, new object[1] { num }); } } [PunRPC] private void RPC_VolumeDown() { if (SemiFunc.IsMasterClient() && Object.op_Implicit((Object)(object)audioSource)) { float num = Mathf.Clamp01(audioSource.volume - 0.1f); ((MonoBehaviourPun)this).photonView.RPC("RPC_SetVolume", (RpcTarget)3, new object[1] { num }); } } [PunRPC] private void RPC_AddPlaylistItem(string url, string name, bool playImmediately) { if (!string.IsNullOrEmpty(url)) { playlist.Add(new PlaylistItem { url = url, isLocal = false, name = name }); videosLoaded = playlist.Count > 0; if (playImmediately) { currentIndex = playlist.Count - 1; StartPlayFromIndex(currentIndex); } } } [PunRPC] private void RPC_RemovePlaylistItem(int index) { if (index >= 0 && index < playlist.Count) { playlist.RemoveAt(index); if (currentIndex >= playlist.Count) { currentIndex = Mathf.Max(0, playlist.Count - 1); } videosLoaded = playlist.Count > 0; } } [PunRPC] private void RPC_SetPlaylistLocal(string[] urls, string[] names) { playlist.Clear(); if (urls != null) { for (int i = 0; i < urls.Length; i++) { string name = ((names != null && i < names.Length) ? names[i] : ""); playlist.Add(new PlaylistItem { url = urls[i], isLocal = true, name = name }); } } videosLoaded = playlist.Count > 0; currentIndex = Mathf.Clamp(currentIndex, 0, (playlist.Count != 0) ? (playlist.Count - 1) : 0); } private void ReloadLocalPlaylist() { if (!SemiFunc.IsMasterClientOrSingleplayer()) { return; } LoadVideoFiles(); playlist.Clear(); List<string> list = new List<string>(); List<string> list2 = new List<string>(); foreach (string videoFilePath in videoFilePaths) { string item = "file:///" + videoFilePath.Replace("\\", "/"); string fileName = Path.GetFileName(videoFilePath); list.Add(item); list2.Add(fileName); } if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("RPC_SetPlaylistLocal", (RpcTarget)3, new object[2] { list.ToArray(), list2.ToArray() }); } else { RPC_SetPlaylistLocal(list.ToArray(), list2.ToArray()); } } }