When working with large scripts in 3dsMax it’s very practical to split the project up in multiple files. Done correctly this loosely resembles an object-oriented approach. Something that maxscript doesn’t really support. While working with multiple files is easier than with a single large one, publishing them is more work. This script helps with that.
I like to publish my scripts as an mzp-file. This is a self-extracting zip-file built for 3dsMax. Within an mzp-file you can bundle scriptfiles, art,presets or other files and link special actions which are executed upon installation. Building such a file needs some manual work however. It’s also very error-prone. I always have to check three times if everything is in place and have to edit my mzp-file after each try. This takes a lot of time and is frustrating. The mzpBuilder creates an mzp-file based on an ini-file you can fill in yourself. It also creates the run-file based on the data in the ini-file.Read more about the mzp-file in the maxscript documentation.
Using the ini-file makes the building process more consistent and a lot quicker. My script covers a small portion of the features of the mzp-files, but it’s enough for me at the moment. I might expand upon this if needed.
there are alternatives to this script: scriptbuilder and package script. They’re both on scriptspot. Both scripts combine multiple scriptfiles into a single one. What you end up with is a single scritpfile which is easy to distribute. It’s not the same as my tool however. The mzp-builder does combine the files in a single installer but it doesn’t touch the scripts themselves. The alternatives only support scriptfiles whereas the mzpbuilder also can include presets, art and whatever file you want to include.
This example shows how I use the mzpBuilder with my sketchfab script. The sketchfab script uses many files, such as scripts, art and presets. In this case I’ve added the ini-file and resulting mzp.run-file below
[Header] name=Sketchfab description=Klaas Nienhuis Scripts version=7 [config] sourcerootpath=N:GitHubsketchfab runfilepath=N:GitHubsketchfabInstallfiles buildfilename=SketchfabPublisher buildfilepath=N:GitHubsketchfabBuild [Source] 1=scriptfilessketchfab.ms 2=scriptfilessketchfab_dae.ms 3=scriptfilessketchfab_errorHandling.ms 4=scriptfilessketchfab_gui.ms 5=scriptfilessketchfab_htmlPost.ms 6=scriptfilessketchfab_multithread.ms 7=scriptfilessketchfab_obj.ms 8=scriptfilessketchfab_rolloutFunctions.ms 9=scriptfilessketchfab_token.ms 10=scriptfilessketchfab_zip.ms 11=artsketchfabBanner_007.jpg 12=artsketchfab_16i.bmp 13=artsketchfab_24i.bmp 14=artsketchfab_24i.ico 15=installfilesKlaasNienhuis_Sketchfab_Install.ms 16=presetsobj_preset_sketchfab.ini 17=presetsopencollada_preset_sketchfab.ini [Destination] 1=$userScriptsKlaasToolsSketchfabscriptfiles 2=$userScriptsKlaasToolsSketchfabscriptfiles 3=$userScriptsKlaasToolsSketchfabscriptfiles 4=$userScriptsKlaasToolsSketchfabscriptfiles 5=$userScriptsKlaasToolsSketchfabscriptfiles 6=$userScriptsKlaasToolsSketchfabscriptfiles 7=$userScriptsKlaasToolsSketchfabscriptfiles 8=$userScriptsKlaasToolsSketchfabscriptfiles 9=$userScriptsKlaasToolsSketchfabscriptfiles 10=$userScriptsKlaasToolsSketchfabscriptfiles 11=$userScriptsKlaasToolsSketchfab 12=$userIcons 13=$userIcons 14=$userIcons 15=$userScriptsKlaasToolsSketchfab 16=$userScriptsKlaasToolsSketchfab 17=$userScriptsKlaasToolsSketchfab [DropIndices] 1=15 [RunIndices] 1=15
Note how the paths of the sourcefiles are all described relative to the rootpath. The script assumes a common root. You can’t take sourcefiles from all over the place. They need to have some structure, i.e. a common root. The destinations however can be totally random, whatever your script needs to function. It’s advisable to use 3dsMax system-paths. these start with the $-sign. they mark locations relative to the max-profile or max-installation on the client-machine.
Also note the runindices are being executed in the order they’re listed in the ini-file. So first script 16 is executed (the macro), then number 15 is executed (the welcome message).
name "Sketchfab" description "Klaas Nienhuis Scripts" version 7 copy "scriptfilessketchfab.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_dae.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_errorHandling.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_gui.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_htmlPost.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_multithread.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_obj.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_rolloutFunctions.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_token.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "scriptfilessketchfab_zip.ms" to "$userScriptsKlaasToolsSketchfabscriptfiles" copy "artsketchfabBanner_007.jpg" to "$userScriptsKlaasToolsSketchfab" copy "artsketchfab_16i.bmp" to "$userIcons" copy "artsketchfab_24i.bmp" to "$userIcons" copy "artsketchfab_24i.ico" to "$userIcons" copy "installfilesKlaasNienhuis_Sketchfab_Install.ms" to "$userScriptsKlaasToolsSketchfab" copy "presetsobj_preset_sketchfab.ini" to "$userScriptsKlaasToolsSketchfab" copy "presetsopencollada_preset_sketchfab.ini" to "$userScriptsKlaasToolsSketchfab" drop $userScriptsKlaasToolsSketchfabKlaasNienhuis_Sketchfab_Install.ms run $userScriptsKlaasToolsSketchfabKlaasNienhuis_Sketchfab_Install.ms clear temp on MAX exit
Before I normally created these mzp.run files by hand. Now I have my builder do it! What a relief.