TD Tools

CryTools for TDs

CryTools: External Apps

There are some exes in the root directory (maxscript).

scmd.exe - this is an app that will silently execute a dos command, this is no longer used, as the the latest exporter plugin now has this functionality. In the example below a directory is synced via perforce:

scmd ("p4 sync \"" + BuildPathFull_crytools + "Tools\\...\"") true

md5.exe- this is a freeware md5 hash generator, it is called from the CryTools md5 function.

CryTools: Global Struct

These globally available variables can be accessed through the crytools struct.

fnStore, _fnStoreIndex, _varStore, _varStoreIndex - These are global storage arrays that allow variables and functions to be stored and passed via the _storeFn, retrieveFn, storeVar, retrieveVar functions. These are never directly accessed.

localBuildNumber - returns the number of the local build. (The build that the current crytools /maxscript dir is loaded from)

print crytools.localBuildNumber
"5571"

BuildPathFull - returns string of the artists build path to the bin32 directory

print crytools.BuildPathFull
"J:\Game02\bin32\"

maxDirTxt - returns string of the max root dir.

print crytools.MaxDirTxt
"C:\3dsmax7\"

editorPath - path string to the Editor

crytools.editorPath
"J:\Game02\bin32\Editor.exe"

cryINI - path string to the CryTools INI file

crytools.cryINI
"C:\Program Files\Autodesk\3ds Max 2008\plugins\CryExport.ini"

maxVersionNum - returns the version number of 3ds Max on which the script is being run

print crytools.maxVersionNum
"8"

project_name - returns the name of the project the artist resides on, taken from the build path.

print crytools.project_name
"Game02"

latest_build - returns the name of the latest build on S:\, this global variable is set from within UpdateTools.ms, which refreshes the latest_builds.txt stored in cry_temp. This is set to "NET_ERROR" if the location cannot be found on the network.

print crytools.latest_build
"Game02(2670)_03_27_FastBuild"

latestBuildNumber - returns the number of the latest build available on S:\, this global variable is set from within UpdateTools.ms, which refreshes the latest_builds.txt stored in cry_temp.

print crytools.latestBuildNumber
"2670"

cryExportPresent - set to true or false based on whether or not the exporter plugin is loaded.

print crytools.cryExportPresent
true

cbaPath - returns string of the CBA path.

print crytools.cbaPath
"J:\Game02\Game\Animations\Animations.cba"

rollback_status - returns whether or not the exporter is currently rolled back to a previous version. This is currently stored in rollback_status.ini in the cryTemp folder.

print crytools.rollback_status
"false"

DOMAIN - returns the network domain of the network the computer is plugged into. This is set via GetDNS() once and written to the first line of cryTools.ini and then read in from there every time at load after. This var is set by AddCryTools.ms

print crytools.DOMAIN
"INTERN.CRYTEK.DE"

CryTools: Functions

These functions are added on load within AddCryTools.ms, and made available through the crytools struct.

scmd <command> wait - Silently runs a dos command using the cryengine export plugin (csexport.export.execute_command_line).

crytools.scmd ("mkdir \"" + crytools.maxDirTxt + "cry_temp\\bad\\\"") true
OK

md5 <filename_string> - Returns string MD5 hash for file queried, you must feed it a valid file. This function uses an open source, public domain MD5 executable stored in the /maxscript folder.

crytools.md5 "C:
WINDOWS
explorer.exe"
"A0732187050030AE399B241436565E64"

storeFn <FUNCTION> <OVERWRITE> </OVERWRITE></FUNCTION> - This stores a function in the global crytools struct where it can be used by any other script. Overwrite will overwrite any existing fn with the same name. You use retrieveFn to retrieve the var you have stored. Here is an example below from the MorphTools script:

cryTools.storeFn collapseVerts true crytools._fnstore#collapseVerts())crytools.retrieveFn "collapseVerts()")()
OK

storeVar <VAR> </VAR><ALIAS><VAR> </VAR><OVERWRITE><VAR></VAR></OVERWRITE></ALIAS> - This stores a variable in the global crytools struct where it can be used by any other script. The var is the item you are storing, and the alias is the associated name. Overwrite will overwrite a stored var with the same alias. You use retrieveVar to retrieve the var you have stored. Here is an example below from the MorphTools script:

cryTools.storeVar $ "obj1" true crytools._varstorecrytools.retrieveVar "obj1"
#($Box:Box01 @ [-101.424500,-0.000001,25.641026])
$Box:Box01 @ [-101.424500,-0.000001,25.641026]

alienBrain <command_argument_string> - This executes AlienBrain command arugments from within 3ds Max. It is set to execute the command via a JDK bridge/DOS command. This does not load ALienBrain.exe (or the long load screen associated with it) and executes the commands instantly and transparently in the background.

crytools.alienBrain "getlatest"

or something more complex like:

crytools.alienBrain ("ab getlatest Bin32\Tools\maxscript -s Server3 -d " + project_name + " -u login -p passwd -forcefileupdate -overwritewritable skip")

existFile <FILENAME_STRING></FILENAME_STRING> - Returns true/false whether file exists or not

crytools.existFile "C:
WINDOWS
explorer.exe"
true

existDir <FILENAME_STRING> </FILENAME_STRING>- Returns true/false whether directory exists or not

crytools.existDir "C:
WINDOWS"
true

or something more complex like:

if (crytools.existDir (maxDirTxt + "cry_temp")) =}} true then (print "cry_temp exists")
"cry_temp exists"

getDNS() - Returns the Domain Name Server of the local network. This uses a dos command to dump and read ipconfig info from a temp file that is then deleted; so it pops up a black cmd window for a milisecond when called. CryTools calls this once, and saves that info in cryTools.ini located in the cryTemp directory in the max root dir.

crytools.getDNS()

"INTERN.CRYTEK.DE"

MirrorObjs <OBJ1> <OBJ2> <MOBJ> <MAXIS> <OAXIS> </OAXIS></MAXIS></MOBJ></OBJ2></OBJ1> - Function for mirroring joint orientations over an arbitrary axis. The below example is from CryAnimationTools.ms, you can look there to see it in use.

crytools.MirrorObjs right_arm[i] left_arm[i] $root #x #x

matchPivot <OBJ1> <OBJ2></OBJ2></OBJ1> - Aligns the pivot of an object to that of another

crytools.matchPivot $obj1 $obj2

findRoot <OBJ></OBJ> - Returns the root of the hierarchy the object is a member of

crytools.findroot $Bip01 L Forearm
$Editable_Mesh:Bip01 @ [0.000000,0.000038,90.368042]

getChildren <OBJ></OBJ> - Returns the root of the hierarchy the object is a member of

print (crytools.getchildren $Bip01 L Thigh)
$PolyMesh:Bip01 L Calf @ [12.594235,-1.113732,49.932632]
$PolyMesh:Bip01 L Foot @ [16.074495,4.691678,9.804122]
$Editable_Mesh:Bip01 L Toe0 @ [17.749069,-7.237181,0.444188]
$Dummy:_Bip01LToeHelper @ [19.030598,-16.366177,0.444188]
$Bone:Bip01 L Toe0Nub @ [19.145245,-17.182899,0.149435]
$Bone:Bip01 L Heel @ [16.074499,4.691682,-0.687943]
$Editable_Mesh:Bip01 L knee @ [12.464909,-0.477371,47.556950]
$Dummy:Bip01 L knee_end @ [13.773256,-8.799936,43.612862]
$Editable_Mesh:weaponPos_pistol_L_leg @ [23.779840,-4.798794,68.739929]

getBips - Returns the Bipeds in the current scene

for obj in crytools.getBips() do print obj.name

"Bip01"
"Bip02"
"Bip03"
"Bip04"

getBindPoseVertexTarget <TARGETNODE> <SOURCENODE> <VERTEXID></VERTEXID></SOURCENODE></TARGETNODE>

createBindPoseMorph <TARGETNODE> <SOURCENODE> <DELETEYN> <ADDMORPHYN> <CHANNELNUM> <EXTRACTEDNODE>

</EXTRACTEDNODE></CHANNELNUM></ADDMORPHYN></DELETEYN></SOURCENODE></TARGETNODE>inFromUDP <TARGETNODE> </TARGETNODE>- This function reads the User Defined Properties for an object into an array

crytools.inFromUDP $

#("mass }} 110", "capsule")

outToUDP <TARGETNODE> <STRING_ARRAY> <ECHO></ECHO></STRING_ARRAY></TARGETNODE> - This function reads/writes to the User Defined Properties buffer for an object

crytools.outToUDP #("I have needed this","for quite some time") $ true
"I have needed this for quite some time"
getUserPropBuffer $
"I have needed this for quite some time"
crytools.inFromUDP $
#("I have needed this", "for quite some time")

local2unc <string> - This will convert a local drive letter to a UNC path

crytools.local2unc "p"
"\\192.168.0.9\public"
local2unc "k"
"\\server2\Artists"

forceLowerCase <STRING> </STRING>- This will convert a string to lowercase

crytools.forceLowerCase "MaSs }} 19.9"

"mass }} 19.9"

nFromINI <PATH> echo</PATH> - This will read in a text file line by line and return an array where array element number corresponds to the line number.

crytools.infromINI (crytools.maxDirTxt + "
plugins
CryExport.ini") true
"[Sandbox]"
"path = J:\Game02\Bin32\Editor.exe"
"animlistpath = J:\Game02\Game\Animations\Animations.cba"
"path {{ J:\Game02\Bin32\Editor.exe", "animlistpath }} J:\Game02\Game\Animations\Animations.cba")

outToINI <data> <path> echo - This will export an array to a text file line by line where array element number corresponds to the line number.

crytools.outtoini test (crytools.maxDirTxt + "
plugins
CryExport.ini") true
"[Sandbox]"
"path = J:\Game02\Bin32\Editor.exe"
"animlistpath = J:\Game02\Game\Animations\Animations.cba"

plusR <PATH></PATH> - this will check if the file exists and make it read-only

crytools.plusR (crytools.maxDirTxt + "
plugins
CryExport.ini")

minusR <PATH></PATH> - this will check if the file exists and make it writable

crytools.minusR (crytools.maxDirTxt + "
plugins
CryExport.ini")

objTrajectoryToSpline <OBJ> </OBJ>- this will create a spline showing the trajectory of all selected objects
cutString <STRING input> <STRING cut to> </STRING></STRING>- this removes the string to cut from the string input.

crytools.cutString "Crysis is a beautiful, meticulously designed game" ", meticulously designed"
"Crysis is a beautiful game"

vertDistance <POS> <POS></POS></POS> - this will output the distance between two positions in space

crytools.vertDistance $Box01.pos $Box02.pos

169.997

copyPasteController <PARENTOBJ> <SELORCHILD> <COPYWHAT> </COPYWHAT></SELORCHILD></PARENTOBJ>- this will copy and paste a controller, here is an example from CryRiggingTools:

crytools.copyPasteController mObj "children" "rp"

sliderMan - this is a fn that works on a selection callback, when you select a slider manipulator, it always goes into manipulate mode so that it can be used.

Items Stored in cry_temp\

A folder named cry_temp is created by AddCryTools.ms, CryTools store many things in this folder, like the following examples:

  • crytools.ini - This stores user-specific options, such as window layout and control panel settings. Here are some of the things stored within:

DOMAIN:INTERN.CRYTEK.DE

WARNMATS:true

REPARENT:true

SUPPRESS:false

NO_UNPARENT_WEAPON:false

RIGGING_POS:1396:78

ANIMATION_POS:1192:78

MORPH_POS:2072:70

ARTIST_POS:698:457

SPLASH:true

UPDATE_COLLECTIONS:false

SYNC_COLLECTIONS:false

LOADOLDANIMTOOLS:false

GENERATEMENU:true

  • latest_builds.txt - When UpdateTools.ms is run, it dumps the latest builds from S:_Builds into this txt file.
  • paths.txt - When CryTools were installed, the InstallCryTools.vbs created this txt file, it stores the install path of 3ds Max and Photoshop. The first line is always 3ds Max and the second Photoshop.

C:\3dsmax7\C:\graphics\Adobe Photoshop CS2\Plug-Ins\

  • rollback_status.ini - A value of true/false is stored in this file. When an artist has rolled back their exporter, the file is set to true, when Get Latest Tools From AlienBrain/Latest Build is pressed in UpdateTools, rollback status is set to false because the latest exporter is installed.
  • CryExport7.dlu, Morpher.dlm, MorpherMXS.dlx - When new copies of these are installed, the prior versions are saved here, where they can be rolled back to on demand. Currently, the rollback function only exists for CryExport7.dlu.