using UdonSharp; using UnityEngine; using VRC.SDK3.Data; using UnityEditor; namespace VRCBoard.Components { [UdonBehaviourSyncMode(BehaviourSyncMode.None)] public abstract class VRCBoardBaseComponent : UdonSharpBehaviour { [HideInInspector] public VRCBoardManager manager; protected abstract void OnRegister(); protected abstract void OnInitialize(); protected abstract void OnSupporterDataUpdate(); protected abstract void OnImageDataUpdate(); protected abstract void OnImageLoaded(); protected internal void _Register(VRCBoardManager _manager) { manager = _manager; OnRegister(); } private bool _imageInitialized; private bool _dataInitialized; private bool _initialized; private void CheckInitialization() { if (_imageInitialized && _dataInitialized && !_initialized) { _initialized = true; OnInitialize(); OnImageDataUpdate(); OnSupporterDataUpdate(); } } protected internal void _OnImageInfoUpdate() { if (_initialized) OnImageDataUpdate(); else { _imageInitialized = true; CheckInitialization(); } } protected internal void _OnSupporterDataUpdate() { if (_initialized) OnSupporterDataUpdate(); else { _dataInitialized = true; CheckInitialization(); } } protected internal void _OnAtlasImageLoaded(int atlasIndex = -1) { OnImageLoaded(); } private DataDictionary GetImageIdInfo(string imageId) => manager._GetImageIdInfo(imageId); internal bool GetImageAtlasTexture(string imageId, string uploader, out Texture2D texture, out int position, out int size, out string type) { return manager._GetImageAtlasTexture(imageId, uploader, out int atlasIndex, out texture, out position, out size, out type); } internal string GetRandomUploader(string imageId) { DataDictionary imageInfo = GetImageIdInfo(imageId); if (imageInfo == null) return null; bool uploadsSuccess = imageInfo.TryGetValue("uploads", out DataToken uploadsToken); if (!uploadsSuccess) return null; if (uploadsToken.TokenType != TokenType.DataList) return null; DataList uploads = uploadsToken.DataList; if (uploads.Count == 0) return null; int randomIndex = Random.Range(0, uploads.Count); DataDictionary upload = uploads[randomIndex].DataDictionary; if (upload == null) return null; bool uploaderSuccess = upload.TryGetValue("a", out DataToken uploaderToken); if (!uploaderSuccess) return null; if (uploaderToken.TokenType != TokenType.String) return null; return uploaderToken.String; } internal void RequestImageLoad(string imageId, string uploaderId = "") { manager._RequestImageLoad(imageId, uploaderId, this); } } #if UNITY_EDITOR && !COMPILER_UDONSHARP [CustomEditor(typeof(VRCBoardBaseComponent), true)] public class VRCBoardBaseComponentEditor : Editor { public override void OnInspectorGUI() { if (Application.isPlaying) { EditorGUILayout.LabelField("Cannot edit a VRCBoard component while in play mode"); //return; } base.OnInspectorGUI(); } } #endif }