[Release] FileStructure (JMXVBAN 0102, JMXVBAN 0101)

12/02/2015 09:20 DaxterSoul#1
I kinda feel weird about posting this structure because it has already been [Only registered and activated users can see links. Click Here To Register...]

However all the file structures belong to this series, has been completed and validated by me, and I'll also throw in some fancy extras.
Credits to [Only registered and activated users can see links. Click Here To Register...] for his initial release

JMXVBAN 0102:
Code:
12  string  Header      //JMXVBAN 0102
4   uint    unkUInt0    //Introduced in JMXVBAN 0102, 0 in all files
4   uint    unkUInt1    //Introduced in JMXVBAN 0102, 0 in all files
4   uint    Name.Length
*   string  Name
4   uint    Duration
4   uint    FramesPerSecond
4   uint    IsContinuous

//Timings of the keyframes, so you can interpolate between two poses.
4   uint    keyframeTimeCount
foreach(keyframeTime)
{
    4   uint    keyframeTime
}

//Amount of bones that have transformations, that are different from their bind poses.
4   uint    animatedBoneCount
foreach(animatedBone)
{
    4   uint    BoneName.Length
    *   string  BoneName    
    4   uint    keyframeCount
    foreach(keyframe)
    {
        //These two together give you the transformation Matrix relative to it's partent bone/joint.
        16  Quaternion  Rotation
        12  Vector3     Translation
    }
}
//EOF
JMXVBAN 0101:
This is, as you probably noticed due to the version number, an older version of the currently used JMXVBAN 0102.
It's only present in 2 files (spidey_attack01.ban and chakji_stand02.ban) in current clients.
spidey_attack01.ban is still referenced it's Resource (*.bsr), chakji_stand02.ban is not.

Nonetheless they are not supported anymore but they could be upgraded from the old format.
Code:
ASSERT("prim\ani\char\china\man\spidey_attack01.ban, File Version Error.
[ÇöÀç ¹öÀü: 808529970 - È*ÀÏ ¹öÀü: 808529969]"), 199, D:\Project\SilkroadOnline\TOOLS & PLUGINS\SimpleViewer\objengine\PrimAnimation.cpp
Code:
12  string  Header      //JMXVBAN 0101
4   uint    Name.Length
*   string  Name
4   uint    Duration
4   uint    FramesPerSecond
4   uint    IsContinuous
4   uint    animatedBoneCount
foreach(animatedBone)
{
    4   uint    BoneName.Length
    *   string  BoneName    
    4   uint    keyframeCount
    foreach(keyframe)
    {
        4   uint        RotationTime        //Both times where identical in all test files.
        4   uint        TranslationTime     //They reduced it in JMXVBAN 0102 to a keyframeList
        16  Quaternion  Rotation
        12  Vector3     Translation
    }
}
//EOF
More obsolete files:
\Data\prim\ani\item\common\mob_select.ban
This file is not referenced within the SRO_Client (hardcoded), nor referenced in any Resource (*.bsr) and has an even older structure.
Code:
42 41 4E 20                      -> FileFormat = BAN
65 00 00 00                      -> Version = 101
0A 00 00 00                      -> Name.Length
6D 6F 62 5F 73 65 6C 65 63 74 00 -> Name = mob_select
E8 03 00 00                      -> Duration
1E 00 00 00                      -> FramesPerSecond
01 00 00 00                      -> IsContinuous
03 00 00 00                      -> animatedBoneCount
    06 00 00 00                      -> BoneName.Length
    42 6F 6E 65 30 31 00             -> BoneName = Bone01
    02 00 00 00                      -> keyframeCount
        00 00 00 00                      -> RotationTime
        00 00 00 00                      -> TranslationTime
        00 00 00 BF                      -> Rotation.X
        00 00 00 BF                      -> Rotation.Y
        00 00 00 3F                      -> Rotation.Z
        00 00 00 3F                      -> Rotation.W
        80 91 29 3D                      -> Translation.X
        F0 BC 27 C0                      -> Translation.Y
        F0 05 F6 33                      -> Translation.Z
...
It might be confusing posting about animations when models weren't covered yet but that's because Resources (*.bsr) and Models (*.bms) are far more complicated and I don't like releasing those when they list a bunch of unknown values unless they are fixed within all files. Which makes it virtually impossible unless you're really good at reverse engineering. I'm still working on those in my spare time ;-)

To be continued...