Bridge Plugin for 3ds Max 2025

Hi, when does Bridge Plugin for Max 2025 will be ready?
Im trying to use Max 2024 script like before with 2023 but its not working

1 Like

Same here. Using the 2024 script like before (manually put in scripts/startup folder gives a python error when starting 3ds max 2025.

2 Likes

Thank u so much for posting, I tought no one had check on this, it has been driving me crazy, there are some tutorials that says that Max 2024 script works on 2025 and they even havent tested yet, I have used lot of script combinations, using commas , ’ , different folder structures, anything works.

Lets hope this could be fixed soon.

Same here, I’ve checked the old method but is giving me line errors. I think Max 2025 have some really diferent code on the script cathegory!

1 Like

Here is a version of the MS_API.py that works.

Copy and overwrite in this folder:
\Megascans Library\support\plugins\max\5.5\MSLiveLink

The Menu is not working yet, but the import works nonetheless.

4 Likes

Thank u so much!!!

Hi together i have the same issue with3DS 2025 and Bridge.
The script dosn’t work ans Bridge is useless for MAX 2025 .

It would be greate if anabody have a solution for this.

I tried your method and it didn’t work with 3ds Max 2025. Any other ideas to solve this problem!

I solved this problem by below steps

  1. copy the scripts folder (“Quixel.ms” in this folder) from C:\Users\xxxx\AppData\Local\Autodesk\3dsMax\20xx-64bit\ENU\scripts and place it in my “Documents” folder for instance;
  2. open the “Quixel.ms” file (if you cannot file “Quixel.ms” file scripts folder you need create it)
  3. paste python.Execute “filePath = r’E:\Megascans Library\support\plugins\max\5.5\MSLiveLink\MS_API.py’; exec(open(filePath).read(), {‘file’: filePath})” and save it. (you need to change the position according to your “MS_API.py” location)
  4. In 3DS, Customize/Configure users and project paths, relink both “additional scripts” folder that is now under “Documents”

it aint working

that didn’t work for me. thank you for trying

Has anyone gotten this to work? tried both options here with no luck so far, much appreciated

hi, did you get this to work for max 2025?

is this working for you in max 2025 and can you make a small detailed video?

+1 for me as well; I can’t get bridge to work in max 2025. Following.

This is why I don’t like updating software…

update from me; all of a sudden a few days later it works! Surprising. Perhaps turning my computer off & restarting everything was the missing link.

Perhaps a few things to check:

  • Change the max script for quixel.ms
  • change the MS_api
  • Make sure the data port is the same number in edit, settings, API port
  • restart your computer

I’ll include my quixel script here:
python.Execute “filePath = u’S:/02_ASSETS/03_QUIXEL BRIDGE/support/plugins/max/5.5/MSLiveLink/MS_API.py’; exec(open(filePath).read(), {‘file’: filePath})”

Hopefully this helps anyone who’s having this issue! Make sure everything routes to the correct paths as well, and perhaps try deleting the old max plug in on bridge and reinstalling it.

Change the API Port Number to 13292 in the setting tab.

hello and thanks … but ( “filePath = u’S:/02_ASSETS/03_QUIXEL BRIDGE ) I don’t have this path … should I enter it anyway as I see it?

Can anyone guide from start to finish on how to get it work? I find the Quixel support is not able to solve it.

Finally managed to successfully launch Quixel Bridge link to 3ds Max 2025!

Yes, 2025. No joke.

  1. You need the v5.1 Plugin version of 3ds max Bridge Quixel Plugin.
    (they removed this version from their site, but if you take the link to download the new version and change there 5.5 to 5.1 - it will download the correct version.)

https://quixel-megascans-static.s3.us-west-2.amazonaws.com/bridge/plugins_12/max/win/5.1.zip

  1. Install the Last Bridge and the latest Plugin like usual. You will have this folder:

My default library folder is in my B:\lib\cg\ folder. You can change it on your own in Bridge > Edit > Settings.
I have my plugins here:

B:\lib\cg\megascans\support\plugins\max\

  1. Unpack here archive with 5.1 Plugin.
    Now You will have 2 plugins. You need only 5.1.
    Just in case, I copied 5.1 and renamed it to 5.1 v2

  2. Open script in Notepad:

B:\lib\cg\megascans\support\plugins\max\5.1 v2\MSLiveLink\MS_API.py

And replace all code completely:


import os, json, sys, socket, time, re

_path_ = os.path.dirname(__file__).replace("\\", "/")
if _path_ not in sys.path:
  sys.path.append( _path_ )

import MS_Importer
from Logging import Logger
_importerSetup_ = MS_Importer.LiveLinkImporter()

MSLIVELINK_VERSION = "5.1"



"""#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*
#####################################################################################

MegascansLiveLinkAPI is the core component of the Megascans Plugin plugins.
This API relies on a QThread to monitor any incoming data from Bridge by communicating
via a socket port.

This module has a bunch of classes and functions that are standardized as much as possible
to make sure you don't have to modify them too much for them to work in any python-compatible
software.
If you're looking into extending the user interface then you can modify the MegascansLiveLinkUI
class to suit your needs.

#####################################################################################
#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*"""



# Updated import statements for PySide6
try:
    from PySide6.QtGui import *
    from PySide6.QtCore import *
    from PySide6.QtWidgets import *
except ImportError:
    print("PySide6 is not available.")



""" GetHostApp returns the host application window as a parent for our widget """

def GetHostApp():
    try:
        mainWindow = QApplication.activeWindow()
        while True:
            lastWin = mainWindow.parent()
            if lastWin:
                mainWindow = lastWin
            else:
                break
        return mainWindow
    except:
        pass


""" QLiveLinkMonitor is a QThread-based thread that monitors a specific port for import.
Simply put, this class is responsible for communication between your software and Bridge."""



class QLiveLinkMonitor(QThread):

    Bridge_Call = Signal()
    Instance = []

    def __init__(self):
        QThread.__init__(self)
        self.TotalData = b""
        QLiveLinkMonitor.Instance.append(self)

    def __del__(self):
        self.quit()
        self.wait()

    def stop(self):
        self.terminate()

    def run(self):

        time.sleep(0.025)

        try:
            host, port = 'localhost', 13292

            socket_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            socket_.bind((host, port))

            while True:
                socket_.listen(5)
                client, address = socket_.accept()
                data = ""
                data = client.recv(4096*2)

                if data != "":
                    self.TotalData = b""
                    self.TotalData += data
                    while True:
                        data = client.recv(4096*2)
                        if data : self.TotalData += data
                        else : break

                    time.sleep(0.05)
                    self.Bridge_Call.emit()
                    time.sleep(0.05)
                    # break
        except:
            pass

    def InitializeImporter(self):
        import pymxs
        json_array = json.loads(self.TotalData)
        for asset_ in json_array:
            self = _importerSetup_.Identifier
            self.set_Asset_Data(asset_)
            try:
                guid = asset_['guid']
                assetID = asset_['id']
            except:
                guid = ""
                assetID = ""
                
            if len(json_array) > 1:
                bridge_event = "BRIDGE_BULK_EXPORT_ASSET"
            else:
                bridge_event = "BRIDGE_EXPORT_ASSET"

            try:
                Logger(pymxs.runtime.execute("classof renderers.current"), pymxs.runtime.maxversion()[7],guid, assetID, bridge_event)
            except:
                Logger(pymxs.runtime.execute("classof renderers.current"), "2019 or lower",guid,assetID,bridge_event)




"""
#################################################################################################
#################################################################################################
"""

stylesheet_ = ("""

QCheckBox { background: transparent; color: #E6E6E6; font-family: Source Sans Pro; font-size: 14px; }
QCheckBox::indicator:hover { border: 2px solid #2B98F0; background-color: transparent; }
QCheckBox::indicator:checked:hover { background-color: #2B98F0; border: 2px solid #73a5ce; }
QCheckBox:indicator{ color: #67696a; background-color: transparent; border: 2px solid #67696a;
width: 14px; height: 14px; border-radius: 2px; }
QCheckBox::indicator:checked { border: 2px solid #18191b;
background-color: #2B98F0; color: #ffffff; }
QCheckBox::hover { spacing: 12px; background: transparent; color: #ffffff; }
QCheckBox::checked { color: #ffffff; }
QCheckBox::indicator:disabled, QRadioButton::indicator:disabled { border: 1px solid #444; }
QCheckBox:disabled { background: transparent; color: #414141; font-family: Source Sans Pro;
font-size: 14px; margin: 0px; text-align: center; }

QComboBox { color: #FFFFFF; font-size: 14px; font-family: Source Sans Pro;
selection-background-color: #1d1e1f; background-color: #1d1e1f; }
QComboBox:hover { color: #c9c9c9; font-size: 14px; font-family: Source Sans Pro;
selection-background-color: #232426; background-color: #232426; } """)


"""
#################################################################################################
#################################################################################################
"""

class LiveLinkUI(QWidget):

    Instance = []
    Settings = [0, 0, 0]


    # UI Widgets

    def __init__(self, _importerSetup_, parent=GetHostApp()):
        super(LiveLinkUI, self).__init__(parent)

        LiveLinkUI.Instance = self
        self.Importer = _importerSetup_

        self._path_ = _path_
        self.setObjectName("LiveLinkUI")
        img_ = QPixmap( os.path.join(self._path_, "MS_Logo.png") )
        self.setWindowIcon(QIcon(img_))
        self.setMinimumWidth(250)
        self.setWindowTitle("MS Plugin " + MSLIVELINK_VERSION + " - 3ds Max")
        self.setWindowFlags(Qt.Window)

        self.style_ = ("""  QWidget#LiveLinkUI { background-color: #262729; } """)
        self.setStyleSheet(self.style_)

        # style_ = ("QLabel {background-color: #232325; font-size: 14px;font-family: Source Sans Pro; color: #afafaf;}")

        # Set the main layout
        self.MainLayout = QVBoxLayout()
        self.setLayout(self.MainLayout)
        self.MainLayout.setSpacing(5)
        self.MainLayout.setContentsMargins(5, 2, 5, 2)


        # Set the checkbox options

        self.checks_l = QVBoxLayout()
        self.checks_l.setSpacing(2)
        self.MainLayout.addLayout(self.checks_l)

        self.applytoSel = QCheckBox("Apply Material to Selection")
        self.applytoSel.setToolTip("Applies the imported material(s) to your selection.")
        self.applytoSel.setChecked( self.Importer.getPref("Material_to_Sel") )
        self.applytoSel.setFixedHeight(30)
        self.applytoSel.setStyleSheet(stylesheet_)
        self.checks_l.addWidget(self.applytoSel)
        
        
        # Enable Displacement Check Box
        # Set the checkbox options

        self.checks_l = QVBoxLayout()
        self.checks_l.setSpacing(2)
        self.MainLayout.addLayout(self.checks_l)

        self.enableDisplacement = QCheckBox("Import 3D Assets with Displacement")
        self.enableDisplacement.setToolTip("Enables displacement for 3D Assets")
        self.enableDisplacement.setChecked( self.Importer.getPref("Enable_Displacement") )
        self.enableDisplacement.setFixedHeight(30)
        self.enableDisplacement.setStyleSheet(stylesheet_)
        self.checks_l.addWidget(self.enableDisplacement)
        
        
        # Save current import settings
        self.applytoSel.stateChanged.connect(self.settingsChanged)
        self.enableDisplacement.stateChanged.connect(self.settingsChanged)

    # UI Callbacks
    def settingsChanged(self):
        settings_data = self.Importer.loadSettings()
        settings_data["Material_to_Sel"] = self.applytoSel.isChecked()
        settings_data["Enable_Displacement"] = self.enableDisplacement.isChecked()
        self.Importer.updateSettings(settings_data)

# LIVELINK INITIALIZER

def initLiveLink():

    if LiveLinkUI.Instance != None:
        try: LiveLinkUI.Instance.close()
        except: pass

    LiveLinkUI.Instance = LiveLinkUI(_importerSetup_)
    LiveLinkUI.Instance.show()
    pref_geo = QRect(500, 300, 460, 30)
    LiveLinkUI.Instance.setGeometry(pref_geo)
    return LiveLinkUI.Instance

#LIVELINK MENU INSTALLER

def createToolbarMenuPymxs():
    import pymxs
    pymxs.runtime.execute(" global mxsInit = 0 ")
    pymxs.runtime.mxsInit = initLiveLink
    pymxs.runtime.execute("""
-- Sample menu extension script
-- If this script is placed in the "stdplugs\stdscripts"
-- folder, then this will add the new items to MAX's menu bar
-- when MAX starts.
-- A sample macroScript that we will attach to a menu item
macroScript Megascans
category: "Quixel"
tooltip: "MS Plugin"
(
on execute do mxsInit()
)


-- This example adds a new sub-menu to MAX's main menu bar.
-- It adds the menu just before the "Help" menu.
if menuMan.registerMenuContext 0x1ee76d8f then
(
-- Get the main menu bar
local mainMenuBar = menuMan.getMainMenuBar()
-- Create a new menu
local subMenu = menuMan.createMenu "Megascans"
-- create a menu item that calls the sample macroScript
local subItem = menuMan.createActionItem "Megascans" "Quixel"
-- Add the item to the menu
subMenu.addItem subItem -1
-- Create a new menu item with the menu as it's sub-menu
local subMenuItem = menuMan.createSubMenuItem "Megascans" subMenu
-- compute the index of the next-to-last menu item in the main menu bar
local subMenuIndex = mainMenuBar.numItems() - 1
-- Add the sub-menu just at the second to last slot
mainMenuBar.addItem subMenuItem subMenuIndex
-- redraw the menu bar with the new item
menuMan.updateMenuBar()
)"""
    )


# Start the LiveLink server here.
def StartSocketServer():
    try:
        if len(QLiveLinkMonitor.Instance) == 0:
            bridge_monitor = QLiveLinkMonitor()
            bridge_monitor.Bridge_Call.connect(bridge_monitor.InitializeImporter)
            bridge_monitor.start()
        print("Quixel Bridge Plugin v" + MSLIVELINK_VERSION + " started successfully.")
        
    except:
        print("Quixel Bridge Plugin v" + MSLIVELINK_VERSION + " failed to start.")
        pass
    
    
try:
    #import pymxs
    #--- Octane3dsmax()
    #--- Vray()
    #--- Arnold()
    #--- CoronaRenderer()
    #
    # Set Starting Renderer
    #pymxs.runtime.execute("renderers.current = Vray()")
    
    createToolbarMenuPymxs()
except:
    print("Failed to create menu.")

StartSocketServer()

I was looking at the script from the person above that posted earlier, and comparing it to what’s in version 5.1.
I removed some parts, that causing the error at max startup, and add PySide6 import.

And yes, the “MS Plugin” panel will need to be added manually.
In toolbar Category you will find Quixel.

  1. When starting the Max for the firth time:

C:\Users\Administrator\AppData\Local\Autodesk\3dsMax\2025 - 64bit\ENU\scripts\startup

this folder will be created. Accordind to your username.

Copy quixel.ms file from older version or create txt file, then change name AND file type to quixel.ms.
Open quixel.ms in Notepad.

Inside I have the following line, which specifies the path to the modified script. This script simply poit the actual plugin script.

python.ExecuteFile @"B:\lib\cg\megascans\support\plugins\max\5.1 v2\MSLiveLink\MS_API.py"

Double check that in this line you refer to the modified 5.1 script.

Thats all. Thanks.

IN SHORT:

  1. Get the 5.1 Bridge Plugin.
  2. Replace MS_API.py code or debug code yourselves.
  3. Change the startup quixel.ms script with the correct modified Plugin link.

I have Win 11 on latest updates, and 2025.2 3ds Max.

Hope this is help. I spend a 2 days on this(

10 Likes