Weapons/ToolGun/Modes/NoCollideTool.cs

[Icon( "⛔" )]
[Title( "#tool.name.nocollide" )]
[ClassName( "nocollide" )]
[Group( "#tool.group.tools" )]
public sealed class NoCollideTool : BaseConstraintToolMode
{
	public override string Description => Stage == 1 ? "#tool.hint.nocollide.stage1" : "#tool.hint.nocollide.stage0";
	public override string PrimaryAction => Stage == 1 ? "#tool.hint.nocollide.finish" : "#tool.hint.nocollide.source";
	public override string ReloadAction => "#tool.hint.nocollide.remove";

	protected override IEnumerable<GameObject> FindConstraints( GameObject linked, GameObject target )
	{
		foreach ( var filter in linked.GetComponentsInChildren<PhysicsFilter>( true ) )
			if ( linked == target || filter.Body?.Root == target )
				yield return filter.GameObject;
	}

	protected override void CreateConstraint( SelectionPoint point1, SelectionPoint point2 )
	{
		var go = new GameObject( point1.GameObject, false, "no collide" );
		var joint = go.AddComponent<PhysicsFilter>();
		joint.Body = point2.GameObject;

		go.NetworkSpawn();

		Track( go );

		var undo = Player.Undo.Create();
		undo.Name = "No Collide";
		undo.Add( go );
	}
}