using 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());
}
}
}