Browse Source

C#: Fix editor unable to play game after IDE PlayRequest

The editor wasn't clearing the debugger agent
settings properly after a processing a play
request from an IDE. This caused consequent play
attempts to fail if not launched from the IDE,
as the game would still attempt and fail to
connect to the debugger.

The concrete cause: Forgetting to clear the
`GODOT_MONO_DEBUGGER_AGENT` environment variable.
Ignacio Etcheverry 5 years ago
parent
commit
6e7da72648

+ 2 - 17
modules/mono/editor/GodotTools/GodotTools/BuildManager.cs

@@ -205,23 +205,8 @@ namespace GodotTools
             if (File.Exists(editorScriptsMetadataPath))
                 File.Copy(editorScriptsMetadataPath, playerScriptsMetadataPath);
 
-            var currentPlayRequest = GodotSharpEditor.Instance.CurrentPlaySettings;
-
-            if (currentPlayRequest != null)
-            {
-                if (currentPlayRequest.Value.HasDebugger)
-                {
-                    // Set the environment variable that will tell the player to connect to the IDE debugger
-                    // TODO: We should probably add a better way to do this
-                    Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT",
-                        "--debugger-agent=transport=dt_socket" +
-                        $",address={currentPlayRequest.Value.DebuggerHost}:{currentPlayRequest.Value.DebuggerPort}" +
-                        ",server=n");
-                }
-
-                if (!currentPlayRequest.Value.BuildBeforePlaying)
-                    return true; // Requested play from an external editor/IDE which already built the project
-            }
+            if (GodotSharpEditor.Instance.SkipBuildBeforePlaying)
+                return true; // Requested play from an external editor/IDE which already built the project
 
             return BuildProjectBlocking("Debug");
         }

+ 1 - 1
modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs

@@ -38,7 +38,7 @@ namespace GodotTools
 
         public BottomPanel BottomPanel { get; private set; }
 
-        public PlaySettings? CurrentPlaySettings { get; set; }
+        public bool SkipBuildBeforePlaying { get; set; } = false;
 
         public static string ProjectAssemblyName
         {

+ 18 - 5
modules/mono/editor/GodotTools/GodotTools/Ides/MessagingServer.cs

@@ -330,9 +330,10 @@ namespace GodotTools.Ides
             {
                 DispatchToMainThread(() =>
                 {
-                    GodotSharpEditor.Instance.CurrentPlaySettings = new PlaySettings();
+                    // TODO: Add BuildBeforePlaying flag to PlayRequest
+
+                    // Run the game
                     Internal.EditorRunPlay();
-                    GodotSharpEditor.Instance.CurrentPlaySettings = null;
                 });
                 return Task.FromResult<Response>(new PlayResponse());
             }
@@ -341,10 +342,22 @@ namespace GodotTools.Ides
             {
                 DispatchToMainThread(() =>
                 {
-                    GodotSharpEditor.Instance.CurrentPlaySettings =
-                        new PlaySettings(request.DebuggerHost, request.DebuggerPort, request.BuildBeforePlaying ?? true);
+                    // Tell the build callback whether the editor already built the solution or not
+                    GodotSharpEditor.Instance.SkipBuildBeforePlaying = !(request.BuildBeforePlaying ?? true);
+
+                    // Pass the debugger agent settings to the player via an environment variables
+                    // TODO: It would be better if this was an argument in EditorRunPlay instead
+                    Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT",
+                        "--debugger-agent=transport=dt_socket" +
+                        $",address={request.DebuggerHost}:{request.DebuggerPort}" +
+                        ",server=n");
+
+                    // Run the game
                     Internal.EditorRunPlay();
-                    GodotSharpEditor.Instance.CurrentPlaySettings = null;
+
+                    // Restore normal settings
+                    Environment.SetEnvironmentVariable("GODOT_MONO_DEBUGGER_AGENT", "");
+                    GodotSharpEditor.Instance.SkipBuildBeforePlaying = false;
                 });
                 return Task.FromResult<Response>(new DebugPlayResponse());
             }