How to do the new vertex method without DasDonkey Vertex Box(+ Without Patching)In this tutorial I'm going to be making Ness' head bigger. You can do whatever you want, but this is just an example. Mariokart's new script makes it so DasDonkey Vertex box isn't needed anymore, and the only tutorials that mariokart has up are videos, so this is for people who want to take things at their own pace. The reason why it's good to not use DasDonkey Vertex Box anymore, is that vertex sets that previously didn't work (Peach's crown, Pokemon Trainer's hat/hair, etc) should work now.
First, export the .brres of the first model data.

You'll need to download AiS which converts the .brres into a .dae, so you can open it in 3DS max. For this to work, make sure that the .brres contains a model which is unedited. If it is edited, then AiS will not work and will simply make a log file. You can download AiS here:
http://cid-c59ea3c98a300f31.skydrive.live.com/self.aspx/.Public/Programs/ais0.1.3.zipNext, export the vertex group that you want to edit in Brawlbox.

Now open 3DS Max 8 (and note that this only works in Max 8 not 9, 2008, 2009 or 2010), and run mariokart64n's script:
fn readBEshort fstream = (
short = readshort fstream #unsigned
short = bit.swapBytes short 1 2
return short
)
fn readBElong fstream = (
long = readlong fstream
long = bit.swapBytes long 1 4
long = bit.swapBytes long 2 3
return long
)
fn ReadBEfloat fstream = (
fpt=readfloat fstream
itger = bit.floatAsInt fpt
hih = bit.intashex itger
while hih.count < 8 do hih = "0" + hih
shn = (substring hih 7 2) + \
(substring hih 5 2) + \
(substring hih 3 2) + \
(substring hih 1 2)
bit.intAsFloat (bit.hexasint shn)
)
-- fn floatSwap2 f = (
-- i = bit.floatAsInt f
-- h = bit.intashex i
-- while h.count < 8 do h = "0" + h
-- s = (substring h 7 2) + (substring h 5 2) + (substring h 3 2) + (substring h 1 2)
-- bit.intAsFloat (bit.hexasint s)
-- )
fn WriteBEFloat fnum = (
intgr = bit.floatAsInt fnum
honey = bit.intashex intgr
while honey.count < 8
do honey = "0" + honey
sign = (substring honey 7 2) + \
(substring honey 5 2) + \
(substring honey 3 2) + \
(substring honey 1 2)
xintgr=bit.intAsFloat (bit.hexasint sign)
return xintgr
)
rollout DDV "Vertex Modding Patcher" width:311 height:257
(
button btn1 "Import Verts" pos:[8,12] width:144 height:40
button btn3 "Create Patch" pos:[8,108] width:144 height:40
button btn4 "Patch Model" pos:[8,156] width:144 height:40
label lbl0 "-Mario_Kart64n, (June22, 2010)" pos:[153,238] width:156 height:23
button btn5 "Fix AiS Import" pos:[8,204] width:144 height:40
checkbox chk6 "Checkbox" pos:[165,202] width:14 height:13
label lbl6 "Scale AIS Import" pos:[182,201] width:111 height:15
button btn2 "Export Verts" pos:[8,60] width:144 height:40
checkbox chk1 "Checkbox" pos:[165,55] width:14 height:13 enabled:false checked:false
label lbl1 "Save as 3DS File" pos:[182,54] width:119 height:15 enabled:false
checkbox chk2 "Checkbox" pos:[165,72] width:14 height:13 enabled:false checked:false
label lbl2 "Save As Seperate Files" pos:[182,71] width:119 height:15 enabled:false
checkbox chk3 "Checkbox" pos:[165,90] width:14 height:13 enabled:true checked:true
label lbl3 "Save Changes to MDL0" pos:[180,89] width:119 height:15
checkbox chk4 "Checkbox" pos:[165,108] width:14 height:13 enabled:true checked:true
label lbl4 "Read Offset from File" pos:[180,107] width:119 height:15
groupBox grp3 "Other Options" pos:[157,185] width:143 height:51
editText edt1 " MDL0 Offset:" pos:[162,125] width:130 height:16
checkbox chk7 "Checkbox" pos:[165,218] width:14 height:13 enabled:false checked:false
label lbl7 "Rotate AIS Import" pos:[181,217] width:111 height:15 enabled:false
label lbl5 "Don't Use EditPoly" pos:[181,164] width:119 height:15 enabled:false
groupBox grp2 "Import Options" pos:[157,148] width:143 height:37
groupBox grp1 "Export Options" pos:[157,7] width:143 height:140
checkbox chk5 "Checkbox" pos:[165,165] width:14 height:13 enabled:false checked:false
radioButtons rdo1 "" pos:[165,21] width:125 height:32 labels:#("Vertices", "Texture Corrdinates") default:1 columns:1
local typedOffset=""
on edt1 entered txt do(
if txt != "" do(
typedOffset=txt as float
if typedOffset<=0 do(
typedOffset=typedOffset*-1
)
local typedOffset
)
)
on btn1 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Import" types: \
"All files (*.*)|*.*|"
f= fopen fsource "rb"
fpath= getFilenamePath fsource
fname = getFilenameFile fsource
vertArray=#()
uvwArray=#()
faceArray=#()
fSize=readBElong f
mdlOffset=readBElong f
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numVertices=readBEshort f
eMinX=readBEfloat f
eMinY=readBEfloat f
eMinZ=readBEfloat f
eMaxX=readBEfloat f
eMaxY=readBEfloat f
eMaxZ=readBEfloat f
pad=readBElong f
pad=readBElong f
if entryStride==12 then(
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=readBEfloat f
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
)
else(
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=0
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
)
msh = mesh vertices:vertArray faces:faceArray --build mesh
msh.numTVerts = vertArray.count
msh.name=fname
buildTVfaces msh
select msh
messageBox "Done !"
gc()
fclose f
)
on btn2 pressed do(
doVerts=chk5.checked
doUVs=rdo1.state
do3DS=chk1.checked
doDUMP=chk2.checked
doMDL=chk3.checked
doOffset=chk4.checked
if doUVs==1 do(
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
local mdlSize=""
local mdlOffset=""
local numEntrtices=""
--
if doOffset==true then(
fsource = GetOpenFileName \
caption:"Select UVSet to Replace" types: \
"All files (*.*)|*.*|"
f=fopen fsource "rb"
mdlSize=readBElong f-64
mdlOffset=(readBElong f*-1)+64
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numEntrtices=readBEshort f
fclose f
)
else(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
mdlSize=(num_verts*12)+64
mdlOffset= typedOffset+64
numEntrtices=num_verts
delete tmesh
)
)
--
fsource = GetOpenFileName \
caption:"Select the MDL0 to inject to" types: \
"MDL0(*mdl0)|*.mdl0|All files (*.*)|*.*|"
fext= getFilenameType fsource
fsize= getFileSize fsource
fpath= getFilenamePath fsource
fname= getFilenameFile fsource
fclose f
--
deleteFile (fpath+fname+"_backup"+fext)
copyFile fsource (fpath+fname+"_backup"+fext)
f=fopen (fpath+fname+"_backup"+fext) "rb"
s = fopen fsource "wb"
print "ffff"
print mdlOffset
for wr = 1 to mdlOffset do(
read=readbyte f
write=writebyte s read
)
fseek f -34 #seek_cur
lenCheck=readBEshort f
fseek f 32 #seek_cur
if numEntrtices==lenCheck then(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
for t = 1 to numEntrtices do(
tv=getVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[3]
write=writelong s (bit.floatasint nSwap)
)
-- for p = 1 to padding do(
-- write=writelong s 0
-- write=writelong s 0
-- )
delete tmesh
)
fseek f (mdlOffset+(numEntrtices*12)) #seek_set
for wr = 1 to (fsize-(mdlOffset+(numEntrtices*12))) do(
read=readbyte f #unsigned
write=writebyte s read
)
messageBox "DONE!"
)
else(
gc()
fclose f
fclose s
deleteFile (fpath+fname+fext)
renameFile (fpath+fname+"_backup"+fext) (fpath+fname+fext)
messageBox "ERROR! Wrong Offset?"
)
)
if doUVs==2 do(
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
--
if doOffset==true then(
fsource = GetOpenFileName \
caption:"Select UVSet to Replace" types: \
"All files (*.*)|*.*|"
f=fopen fsource "rb"
mdlSize=readBElong f-64
mdlOffset=(readBElong f*-1)+64
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numEntrtices=readBEshort f
fclose f
)
else(
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
mdlSize=num_verts*8
mdlOffset= typedOffset+64
numEntrtices=num_verts
delete tmesh
)
)
--
fsource = GetOpenFileName \
caption:"Select the MDL0 to inject to" types: \
"MDL0(*mdl0)|*.mdl0|All files (*.*)|*.*|"
fext= getFilenameType fsource
fsize= getFileSize fsource
fpath= getFilenamePath fsource
fname= getFilenameFile fsource
fclose f
--
deleteFile (fpath+fname+"_backup"+fext)
copyFile fsource (fpath+fname+"_backup"+fext)
f=fopen (fpath+fname+"_backup"+fext) "rb"
s = fopen fsource "wb"
print "ffff"
print mdlOffset
for wr = 1 to mdlOffset do(
read=readbyte f
write=writebyte s read
)
for g = 1 to obj.count do(
tmesh = snapshotAsMesh obj[g]
num_verts = tmesh.numverts
num_uvws = tmesh.numtverts
num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
if num_uvws!=0 then(
for t = 1 to numEntrtices do(
tv=getTVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
)
)
else(
for t = 1 to numEntrtices do(
tv=getVert tmesh t
nSwap=writeBEfloat tv[1]
write=writelong s (bit.floatasint nSwap)
nSwap=writeBEfloat tv[2]
write=writelong s (bit.floatasint nSwap)
)
)
-- for p = 1 to padding do(
-- write=writelong s 0
-- write=writelong s 0
-- )
delete tmesh
)
fseek f (mdlOffset+(numEntrtices*8)) #seek_set
for wr = 1 to (fsize-(mdlOffset+(numEntrtices*8))) do(
read=readbyte f #unsigned
write=writebyte s read
)
)
gc()
fclose f
fclose s
)
on btn3 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Import" types: \
"All files (*.*)|*.*|"
f= fopen fsource "rb"
fpath= getFilenamePath fsource
fname = getFilenameFile fsource
vertArray=#()
uvwArray=#()
faceArray=#()
fSize=readBElong f
mdlOffset=readBElong f
dataOffset=readBElong f
strOffset=readBElong f
vertID=readBElong f
vUkn1=readBElong f --flag? is XYZ?
dataType=readBElong f
entryStride=readBEshort f
numVertices=readBEshort f
eMinX=readBEfloat f
eMinY=readBEfloat f
eMinZ=readBEfloat f
eMaxX=readBEfloat f
eMaxY=readBEfloat f
eMaxZ=readBEfloat f
pad=readBElong f
pad=readBElong f
for x = 1 to numVertices do(
vX=readBEfloat f
vY=readBEfloat f
vZ=readBEfloat f
append vertArray[vX,vY,vZ]
append uvwArray[0,0,0]
)
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
max modify mode
addModifier obj (edit_poly())
subobjectLevel = 1
-- modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
diffArray=#()
directionArray=#()
for x = 1 to numVertices do(
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
$.modifiers[#Edit_Poly].Select #Vertex #{x}
vert=$.modifiers[#Edit_Poly].GetVertex x
-- $.modifiers[#Edit_Poly].SetOperation #Transform
mX=(vertArray[x][1])-(vert[1])
mY=(vertArray[x][2])-(vert[2])
mZ=(vertArray[x][3])-(vert[3])
append diffArray[mX,mY,mZ]
)
deleteModifier obj 1
createFile (fpath+fname+"_patch.pta")
s = fopen (fpath+fname+"_patch.pta") "ab"
vcount=writelong s numVertices
for x = 1 to numVertices do(
write=writefloat s (diffArray[x][1])
write=writefloat s (diffArray[x][2])
write=writefloat s (diffArray[x][3])
write=writelong s 0x0
)
messageBox ("Patch Created !" +"\n"+
"\n"+
"File Saved To:" +"\n"+
(fpath+fname+"_patch.pta")
)
gc()
fclose s
fclose f
)
on btn4 pressed do(
fsource = GetOpenFileName \
caption:"Brawl Vert Patcher" types: \
"Patch(*pta)|*.pta|All files (*.*)|*.*|"
f= fopen fsource "rb"
fpath= getFilenamePath fsource
vertArray=#()
vcount=readlong f #unsigned
for x = 1 to vcount do(
vX=readfloat f
vY=readfloat f
vZ=readfloat f
dmy=readshort f #unsigned
side=readshort f #unsigned
append vertArray[vX,vY,vZ,side]
)
obj=getCurrentSelection()
obj.pos = [0,0,0]
obj.rotation = quat 0 0 0 0
max modify mode
addModifier obj (edit_poly())
subobjectLevel = 1
--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
for x = 1 to vcount do(
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
$.modifiers[#Edit_Poly].Select #Vertex #{x}
vert=$.modifiers[#Edit_Poly].GetVertex x
$.modifiers[#Edit_Poly].SetOperation #Transform
mX=(vertArray[x][1])
mY=(vertArray[x][2])
mZ=(vertArray[x][3])
$.modifiers[#Edit_Poly].MoveSelection [mX,mY,mZ]
$.modifiers[#Edit_Poly].Commit ()
$.modifiers[#Edit_Poly].SetSelection #Vertex #{}
)
subobjectLevel = 0
--modPanel.setCurrentObject obj.modifiers[#Edit_Poly]
messageBox "Patched !"
gc()
fclose f
)
on btn5 pressed do(
disableSceneRedraw()
st = timestamp() --get start time in milliseconds
undo off(
geo=$polygon*
-- print geo
for x = 1 to geo.count do(
addModifier geo[x] (Normalmodifier ())
geo[x].modifiers[#Normal].flip = on
addModifier geo[x] (smooth ())
geo[x].modifiers[#Smooth].smoothingBits = 1
collapseStack geo[x]
m2010=chk6.checked
if m2010==true do(
--rotate geo[x] (quat -1 0 0 0)
geo[x].scale = [2.54,2.54,2.54]
)
)
delete $helpers
for x = 1 to geo.count do(
-- aBox = Box length:0.2 width:0.2 height:0.2 name:"dummy"
aBox = Box()
aBox.rotation = quat 0.707107 0 0 0.707107
convertTo aBox TriMeshGeometry
)
dmy=$Box*
myBoxes=#()
myMeshes=#()
for x = 1 to geo.count do(
objA= dmy[x]
objB= geo[x]
append myBoxes objA
append myMeshes objB
)
for x = 1 to geo.count do(
myBoxes[x].name = myMeshes[x].name
attach myBoxes[x] myMeshes[x]
)
for x = 1 to geo.count do(
for i = 1 to 8 do(
delete geo[x].verts[#{1}]
)
addModifier geo[x] (Morpher ())
)
addModifier $Polygon* (Edit_Mesh ())
)
et = timestamp() --get end time in milliseconds
enableSceneRedraw()
gc()
print ("Operation Completed In: "+(((et-st)/60)as string)+" Seconds") --print time to finish
)
)
createDialog DDV
At the top of 3DS max, you'll find that it says MAXScript. Press new script and a box will open up. Copy mariokart's script and paste it in there. Then save it as whatever you like. (I saved it as "vertex"). Now you'll have to run the script and you'll see that a box that says "Vertex Modding Patcher" will open up.

Import the .dae in 3DS max. To do this, you'll need COLLADA which you can download here:
http://sourceforge.net/projects/colladamaya/files/COLLADAMax%201.4.1%20plug-ins/ColladaMax_FREE_3.05C.exe/ColladaMax_FREE_3.05C.exe/download 
You'll find that the model looks a bit messed up.

However, this can be fixed easily. Make sure that "Scale AIS Import" is selected in the Vertex Modding Patcher and press "Fix AiS Import". Scale AIS Import will correct the size of the model so you don't need to make over exaggerated changes for something to look correct in Brawlbox.

There, the model looks normal now.
Now what you do, is choose the polygon that you want to edit. Since I'm editing Ness' face, I'll right click on his face and press "Hide unselected".

Creepy, eh? XD
Now in the Vertex Modding Patcher, click "Import Verts". Select the vertex set which you previously exported from Brawlbox.

The vertex group is now opened up. They won't show up unless you click the button (the one with the three red dots), but you don't need them to show up anyways.

Now that that's done, on the right you should see something that says "Modifier List". Below that is something that says:
+ Edit Mesh
Morpher
+ Editable Mesh
Click Morpher. Below, you should see buttons that say "-empty-" and "0.0" beside them.

Right click on the first "-empty-" and press "Pick from scene". Then press "H" on your keyboard.

This box should show up. Select your vertex set, and then press Pick.

There, now leave that as it is. (We'll come back to it later) Above that, click "+ Edit Mesh" and now you can start editing as you wish like you normally would.

Now that we're done with the editing...

Go back to "Morpher" and raise the "0.0" up to 100.

As you can see, the model looks messed up now. Don't worry though, that's normal.
Next, you have to lay the model on it's back. You can either do the hard way or the easy way. The hard way being rotating the model by yourself and making sure the angles at the bottom (X, Y and Z) say 0, or by doing the easy way which is:
Press "B" and then "P" on your keyboard. It changes the view of the window. "B" lays it on it's back, and "P" puts it back into your perspective view.

Now click on your model and on the right side, right click on +Edit Mesh and press Collapse All.

A warning will pop up, but just press "Yes".
Now press "H" on your keyboard and select the vertex set.

Go to Modifier List and then select Morpher. Right click the -empty- like before, but this time click the polygon/model and raise the 0.0 up to 100.

In Brawlbox, export the model (FitNess00 in my case) and check the MDL0 Offset of your vertex set.

Now go back to the Vertex Modding Patcher box and write down the MDL0 Offset in the box. Make sure that Read Offset from file is unchecked or you'll get an error. (in the pic it's not unchecked though, but don't mind that).

Then press Export Verts and choose your model that you exported.

Replace the model in brawlbox, and success! Now you can go edit other parts to make the model look even better.
