Editor/Tools/WorldBuildingTools.ClutterPhysics.cs

Editor tools for worldbuilding. Exposes two MCP tools: one to scatter/clear/erase clutter calling ClutterAndPhysicsDriver.ScatterClutter, and one async tool to run physics settling via ClutterAndPhysicsDriver.SettlePhysicsAsync and return JSON results or failure payloads.

Networking
#nullable enable
using System;
using System.ComponentModel;
using System.Threading.Tasks;

namespace Editor.Mcp
{
	public static partial class SboxMcpAssistant
	{
		[McpTool( "pocketknife_clutter_scatter" )]
		public static string ClutterScatter(
			[Description( "Action: scatter, clear, erase, flush" )] string action = "flush",
			[Description( "Brush/scatter radius" )] float radius = 500.0f,
			[Description( "Density instance count" )] int density = 50 )
		{
			try
			{
				return McpJson.Write( ClutterAndPhysicsDriver.ScatterClutter( action, radius, density ) );
			}
			catch ( Exception ex )
			{
				return McpJson.Write( ToolOutcome<object>.Failure( null, ToolStatus.Failed, "clutter.scatter_failed", "Clutter scattering failed.", ex ) );
			}
		}

		[McpTool( "pocketknife_physics_settle" )]
		public static async Task<string> PhysicsSettle(
			[Description( "Duration in seconds to let physics simulate and settle (0.2 - 10.0)" )] float durationSeconds = 1.5f,
			[Description( "Optional tag to filter which rigidbodies settle" )] string? targetTag = null )
		{
			try
			{
				var result = await ClutterAndPhysicsDriver.SettlePhysicsAsync( durationSeconds, targetTag );
				return McpJson.Write( result );
			}
			catch ( Exception ex )
			{
				return McpJson.Write( ToolOutcome<object>.Failure( null, ToolStatus.Failed, "physics.settle_failed", "In-editor physics settling failed.", ex ) );
			}
		}
	}
}