diff --git a/Assets/Examples/LobbiesServers/Scripts/GameManager.cs b/Assets/Examples/LobbiesServers/Scripts/GameManager.cs index 0af357b..a13f9b9 100644 --- a/Assets/Examples/LobbiesServers/Scripts/GameManager.cs +++ b/Assets/Examples/LobbiesServers/Scripts/GameManager.cs @@ -16,7 +16,6 @@ public class GameManager : NetworkBehaviour [SerializeField] private Vector3 cameraOffset = new Vector3(0, 5, -5); [SerializeField] private float cameraSmoothTime = 0.25f; - [SerializeField] private float cameraAngle = 45f; // Angle of the camera from horizontal public Player LocalPlayer; private Vector3 cameraVelocity; diff --git a/Assets/Rivet/Editor/Native/librivet_toolchain_ffi_macos_arm64.dylib b/Assets/Rivet/Editor/Native/librivet_toolchain_ffi_macos_arm64.dylib index 9d9fcfa..18a51e2 100755 --- a/Assets/Rivet/Editor/Native/librivet_toolchain_ffi_macos_arm64.dylib +++ b/Assets/Rivet/Editor/Native/librivet_toolchain_ffi_macos_arm64.dylib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:83bb1a555424c8ac985c8b2348a743bb3566a04185edcc9aeaf57f71213874a9 -size 130169600 +oid sha256:9bf05c0f44b105c8866886afca1d13825655712cca041f5bbf2caceb9ee5a5f6 +size 261571456 diff --git a/Assets/Rivet/Editor/RivetGlobal.cs b/Assets/Rivet/Editor/RivetGlobal.cs index f6f9fd8..5d49391 100644 --- a/Assets/Rivet/Editor/RivetGlobal.cs +++ b/Assets/Rivet/Editor/RivetGlobal.cs @@ -7,6 +7,7 @@ using Newtonsoft.Json.Linq; using Rivet.Editor.Types; using Rivet.Editor.UI.Dock; +using System.Linq; namespace Rivet.Editor { @@ -44,7 +45,18 @@ public bool IsAuthenticated // MARK: Environment public EnvironmentType EnvironmentType { - get { return PluginSettings.EnvironmentType; } + get + { + if (IsAuthenticated) + { + // Only allow remote env type if authenticated + return PluginSettings.EnvironmentType; + } + else + { + return EnvironmentType.Local; + } + } set { PluginSettings.EnvironmentType = value; @@ -53,7 +65,18 @@ public EnvironmentType EnvironmentType } public string? RemoteEnvironmentId { - get { return PluginSettings.RemoteEnvironmentId; } + get { + var remoteEnvId = PluginSettings.RemoteEnvironmentId; + + // Validate plugin is authenticated & the env belongs to this + // game. This prevents returning an env ID from a game that + // isn't linked. + if (CloudData is { } cloudData && cloudData.Environments.Any(x => x.Id == remoteEnvId)) { + return remoteEnvId; + } else { + return null; + } + } set { PluginSettings.RemoteEnvironmentId = value; @@ -123,7 +146,15 @@ public string BackendEndpoint case EnvironmentType.Remote: if (CloudData is { } cloudData && RemoteEnvironmentId is { } remoteEnvId) { - return cloudData.Backends[remoteEnvId].Endpoint; + if (cloudData.Backends.TryGetValue(remoteEnvId, out var backend)) + { + return backend.Endpoint; + } + else + { + RivetLogger.Error("BackendEndpoint: no backend for environment"); + return ""; + } } else { @@ -158,13 +189,13 @@ public string CurrentBuildSlug } else { - RivetLogger.Error("CurrentBuildSlug: no current build or version in build"); + RivetLogger.Log("CurrentBuildSlug: no current build or version in build"); return ""; } } else { - RivetLogger.Error("CurrentBuildSlug: not authenticated"); + RivetLogger.Warning("CurrentBuildSlug: not authenticated"); return ""; } default: @@ -194,7 +225,14 @@ public async Task Bootstrap() SharedSettings.UpdateFromPlugin(); // Emit event - Dock.Singleton?.OnBootstrap(); + if (Dock.Singleton is { } dock) + { + dock.OnBootstrap(); + } + else + { + RivetLogger.Warning("Dock singleton is null"); + } } } } \ No newline at end of file diff --git a/Assets/Rivet/Editor/Task.cs b/Assets/Rivet/Editor/Task.cs index f1ca40a..0d4fa02 100644 --- a/Assets/Rivet/Editor/Task.cs +++ b/Assets/Rivet/Editor/Task.cs @@ -45,10 +45,7 @@ public RivetTask(string name, JObject input) private void Run(string name, string inputJson) { - RivetLogger.Log($"starting run"); _taskId = RivetToolchain.RunTask(name, inputJson, OnOutputEvent); - RivetLogger.Log($"run finished"); - RivetLogger.Log($"running {_taskId}"); } private void OnOutputEvent(ulong taskId, IntPtr eventJsonPtr) @@ -59,16 +56,13 @@ private void OnOutputEvent(ulong taskId, IntPtr eventJsonPtr) private void HandleOnOutputEvent(string eventJson) { - RivetLogger.Log($"got event {eventJson}"); - var eventObj = JObject.Parse(eventJson); if (eventObj.ContainsKey("log")) { - OnLogEvent(eventObj); + OnLogEvent((string)eventObj["log"]); } else if (eventObj.ContainsKey("result")) { - RivetLogger.Log("got result"); // 1st result = event enum type // 2nd result = result enum type _logResult = eventObj["result"]["result"] as JObject; @@ -76,13 +70,12 @@ private void HandleOnOutputEvent(string eventJson) } else if (eventObj.ContainsKey("port_update")) { - var backendPort = eventObj["port_update"]["backend_port"].Value(); - var editorPort = eventObj["port_update"]["editor_port"].Value(); - // TODO: - // Assuming you have a similar configuration saving mechanism - // RivetPluginBridge.Instance.LocalBackendPort = port; - // RivetPluginBridge.Instance.SaveConfiguration(); - RivetLogger.Log($"Set backend port {backendPort} {editorPort}"); + var plugin = RivetGlobal.Singleton; + plugin.LocalBackendPort = eventObj["port_update"]["backend_port"].Value(); + plugin.LocalEditorPort = eventObj["port_update"]["editor_port"].Value(); + SharedSettings.UpdateFromPlugin(); + + RivetLogger.Log($"Port update: backend={plugin.LocalBackendPort} editor={plugin.LocalEditorPort}"); } else if (eventObj.ContainsKey("backend_config_update")) { @@ -95,9 +88,9 @@ private void HandleOnOutputEvent(string eventJson) } } - private void OnLogEvent(JObject eventObj) + private void OnLogEvent(string log) { - TaskLog?.Invoke(eventObj["log"].ToString(), LogType.STDOUT); + TaskLog?.Invoke(log, LogType.STDOUT); } private void OnFinish() @@ -121,19 +114,19 @@ private void OnFinish() outputResult = _logResult; } - RivetLogger.Log($"[{_name}] Response: {outputResult.ToString(Newtonsoft.Json.Formatting.None)}");; - TaskOutput?.Invoke(outputResult); if (outputResult.ContainsKey("Ok")) { - RivetLogger.Log($"[{_name}] Success: {outputResult["Ok"]}"); + RivetLogger.Log($"[{_name}] Success: {outputResult["Ok"].ToString(Newtonsoft.Json.Formatting.None)}"); TaskOk?.Invoke(outputResult["Ok"] as JObject); } else if (outputResult.ContainsKey("Err")) { - RivetLogger.Error($"[{_name}] Error: {outputResult["Err"]}"); + RivetLogger.Error($"[{_name}] Error: {outputResult["Err"].ToString(Newtonsoft.Json.Formatting.None)}"); TaskError?.Invoke(outputResult["Err"].ToString()); - } else { + } + else + { RivetLogger.Error($"[{_name}] Missing Err or Ok in result: {outputResult.ToString(Newtonsoft.Json.Formatting.None)}"); } diff --git a/Assets/Rivet/Editor/UI/Dock/Dock.cs b/Assets/Rivet/Editor/UI/Dock/Dock.cs index 0ce41d6..fb11f32 100644 --- a/Assets/Rivet/Editor/UI/Dock/Dock.cs +++ b/Assets/Rivet/Editor/UI/Dock/Dock.cs @@ -22,7 +22,7 @@ public class Dock : EditorWindow public static Dock? Singleton; [SerializeField] - private VisualTreeAsset m_VisualTreeAsset; + private VisualTreeAsset _visualAssetTree; private VisualElement _root { @@ -51,6 +51,9 @@ private VisualElement _root private VisualElement _settingsTabBody; private SettingsController _settingsController; + // MARK: Buttons + private Button _signInButton; + private Button _hubButton; // MARK: Tasks public TaskManager LocalGameServerManager; @@ -66,38 +69,44 @@ public static void ShowPlugin() public void CreateGUI() { - m_VisualTreeAsset.CloneTree(rootVisualElement); + _visualAssetTree.CloneTree(rootVisualElement); - // Bind links + // Query var links = rootVisualElement.Q(name: "Header").Q(name: "Links"); - links.Q(name: "SignInButton").RegisterCallback((ev) => Application.OpenURL("https://rivet.gg/learn/unity")); - links.Q(name: "HubButton").RegisterCallback((ev) => Application.OpenURL("https://rivet.gg/learn/unity")); - links.Q(name: "DocsButton").RegisterCallback((ev) => Application.OpenURL("https://rivet.gg/learn/unity")); - links.Q(name: "FeedbackButton").RegisterCallback((ev) => Application.OpenURL("https://hub.rivet.gg/?modal=feedback&utm=unity")); + _signInButton = links.Q