
Header
Code: Select all
Header Block Start - Chars(4)
4 reversed characters defining the Header.
Engine Version - Int32
Specific integer defining the version of Bungies Map Builder. Halo 2's version is 8.
Map Size - Int32
Total size of the map file.
Null - Bytes(4)
Index Offset - Int32
Offset pointing to an table of tag classes.
Index Size - Int32
Size of the Tag Class Index
Meta Table Start - IndexOffset + IndexSize
Table of Tag Structures.
Meta Table Size - Int32
Size of the Tag Structure table
Non Raw Size - Int32
Size of the Index, Meta Table and BSP Meta.
Null - Bytes(256)
Map Build Date - Chars(32)
Date the map was compiled.
Map Type - Int32
Defines the Map Type.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Crazy Size - Int32
Size of the Crazy Table.
Crazy Offset - Int32
Table of unused tags. There purpose is unknown.
Unknown - Int32?
Unknown Purpose.
Primary Script Reference Table Offset - Int32
Primary table of Script references, spaced 128 bytes apart.
Script Reference Count - Int32
Number of Script references.
Script Reference Table Size - Int32
Size of the Script Reference Table.
Script Reference Index Offset - Int32
Index of pointers to Script References in the Secondary Script Reference Table.
Secondary Script Reference Table Offset - Int32
Table of Script References separated by a null terminating byte.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Unknown - Int32?
Unknown Purpose.
Map Name - Chars(36)
Name of the Map.
Map Scenario - Chars(256)
Scenario of the map used to identify it.
Unknown - Int32?
Unknown Purpose.
Tag Count - Int32
Number of Tags in the map.
File Table Offset - Int32
Table of Tag folder hierarchy.
File Table Size - Int32
Size of the File Table.
File Table Index Offset - Int32
Index of pointers to entry's in the File Table.
Map Checksum - Int32
Checksum of every byte after the Header XOR'ed together.
Null - Bytes(1320)
Footer Block - Chars(4)
4 reversed letters defining the map Footer.
Notes:
The header has a constant size of 2048.
public enum MapType : int
{
Multiplayer = 0,
Singleplayer = 1,
Shared = 2,
MainMenu = 3,
SingleplayerShared = 4
}
Code: Select all
Primary Magic Base - Int32
Base Primary Magic.
Primary Magic - PrimaryMagicBaseAddress - (IndexOffset + 32)
Used to find Tag Meta Offsets in memory, and to calculate the Tag Start.
Tag List Entry Count - Int32
Number of Tag Classes. See Tag List Definition.
Object Index Base Address - Int32
Base address to the Object Index.
Object Index - ObjectIndexBaseAddress - PrimaryMagic
Points to an Index of Tags.
Scenario Identifier - Int32
Identifier of the Scenario tag.
Globals Identifier - Int32
Identifier of the Globals tag.
Unknown - Int32?
Unknown Purpose.
Tag Count - Int32
Number of Tags int the map.
Tag Start Block - Chars(4)
4 reversed letters defining the Tag Start.
Secondary Magic Base Address - Raw Meta Offset of the Globals(matg) Tag.
Secondary Magic - SecondaryMagicBaseAddress - (IndexOffset + IndexSize)
Used to calculate the Meta offset of tags, and the translation of Reflexives.
Notes:
The Index has a constant Header Length of 32.
Index Layout:
- Header
- Tag List
- Object Index
Tag List:
This list contains all used tags in the map file, and defines their object hierarchy.
This allows the engine to know for example, that all vehicles are a sub class of the
unit class, which is a sub class of the object class. I believe the wildcard tags are
used as a way of using the primary tag without its parents, though this is just speculation. - Iron Forge
Object Index:
The object index is a recursively-constructed collection defining all objects in the map.
The objects identifier is defined here, which is used to reference the object from all other
areas of the map file. The identifier is composed of two short values, each are incremented
equally throughout the index. The meta offset is a secondary magic offset which points to
the beginning of the objects meta. - Iron Forge
Code: Select all
public class Tag
{
public string Class; // 4 reversed letters.
public int RawMetaOffset;
public int MetaOffset; // RawMetaOffset - SecondaryMagic
public int MetaSize;
public int Identifier;
public string Path;
}
Code: Select all
Notes:
Raw offsets in Halo 2 have no magic applied to them. However, they can reference the
current map file, or the three shared files. To do this, it reserves the two most significant
(highest) bits to define the referencing file. These are defined as: 002 being local file, 012
being mainmenu.map, 102 being shared.map, and 112 being single_player_shared.map.
When referencing a raw offset, one should first determine the file being referenced, remove
those two bits from the offset value (and with 0x3FFFFFFF), and then seek to that offset in
the correct file to find the referenced data. Given the size of the shared files, it is possible that
the third most significant bit is also reserved for sharing new downloadable content in the future,
but this would just be speculation. - Iron Forge
Code: Select all
Notes:
Although nothing is really know about the crazy table, it is just a table of some random
tag paths. It can be accessed by the offsets in the header.
Code: Select all
Notes:
Bitmaps in Halo 2 are standard DDS images. Each bitmap is allowed 6 levels of detail(LODs)
although only the first 3 are used; each having their own set of mip maps. Bitmaps are still
swizzled (a method of faster memory copies).
<struct name="Bitmap Data" offset="68" visible="True" size="116" label="ID">
<tag name="Tag" offset="0" visible="False" />
<short name="Width" offset="4" visible="True" />
<short name="Height" offset="6" visible="True" />
<short name="Depth" offset="8" visible="True" />
<short name="Type" offset="10" visible="True" />
<short name="Format" offset="12" visible="True" />
<bitmask16 name="Flags" offset="14" visible="True">
<option name="^2 Dimensions" value="0" />
<option name="Compressed" value="1" />
<option name="Palettized" value="2" />
<option name="Swizzled" value="3" />
<option name="Linear" value="4" />
<option name="v16u16" value="5" />
<option name="HUD Bitmap?" value="7" />
<option name="Always on?" value="9" />
<option name="Interlaced?" value="12" />
</bitmask16>
<short name="Reg X" offset="16" visible="True" />
<short name="Reg Y" offset="18" visible="True" />
<short name="MipMap Count" offset="20" visible="True" />
<short name="PixelOffset" offset="22" visible="True" />
<int name="Zero" offset="24" visible="False" />
<int name="LOD1 Offset" offset="28" visible="True" />
<int name="LOD2 Offset" offset="32" visible="True" />
<int name="LOD3 Offset" offset="36" visible="True" />
<unused offset="40" size="12" />
<int name="LOD1 Size" offset="52" visible="True" />
<int name="LOD2 Size" offset="56" visible="True" />
<int name="LOD3 Size" offset="60" visible="True" />
<unused offset="64" size="12" />
<id name="ID" offset="76" visible="True" />
<unused offset="80" size="8" />
<bitmask32 name="Flags(CBZ)" offset="88" visible="False" />
<unused offset="92" size="4" />
<int name="Unknown(CBZ)" offset="96" visible="False" />
<int name="Unknown(CBZ)" offset="100" visible="False" />
<int name="Unknown(CBZ)" offset="104" visible="False" />
<int name="Unknown(CBZ)" offset="108" visible="False" />
<unused offset="112" size="4" />
</struct>
Code: Select all
Notes:
The Coconuts tag has a lot of reflexives that organize sounds. It also has 1 reflexive with model Raw
details. Kudos to Iron Forge for being the only person to ever map anything in this tag. I have since
then add some new things as well as clean it up. This tag is based on reflexives with index's into more
reflexives. The base reflexive is Sound Permutations, this has the index to Sound Names, and Sound Choices.
Sound Names is just a stringid with a name for that sound, Sound Choices is a list of possible sound files
to play. Each one indexing a Sound Raw Chunk. There is also a Model Raw reflexive, my guess is since the
crazy tag is ALWAYS the last tag, the engine can render all models without reading every model tag.
I also assume there is some sort of tag pointer in that reflexive or vice versa. The Coconuts tag also has a lot
of loneid's to itself, not sure why but they are important to fix when adding new tags to the map.
<reflexive name="Unknown" offset="0" visible="false" size="56" label="">
<float name="Unknown" offset="0" visible="False" />
<float name="Unknown" offset="4" visible="False" />
<float name="Unknown" offset="8" visible="False" />
<float name="Unknown" offset="12" visible="False" />
<float name="Unknown" offset="16" visible="False" />
<float name="Unknown" offset="20" visible="False" />
<short name="Unknown" offset="24" visible="False" />
<short name="Unknown" offset="26" visible="False" />
<float name="Pi" offset="28" visible="True" />
<float name="Pi" offset="32" visible="True" />
<unused offset="36" size="20" />
</reflexive>
<reflexive name="Unknown" offset="8" visible="false" size="20" label="">
<float name="Unknown" offset="0" visible="False" />
<float name="Unknown" offset="4" visible="False" />
<short name="Unknown" offset="8" visible="False" />
<short name="Unknown" offset="10" visible="False" />
<float name="One" offset="12" visible="False" />
<float name="One" offset="16" visible="False" />
</reflexive>
<reflexive name="Sound Names" offset="16" visible="true" size="4" label="">
<stringid name="Name" offset="0" visible="True" />
</reflexive>
<reflexive name="Unknown" offset="24" visible="false" size="10" label="">
<short name="Unknown" offset="0" visible="True" />
<short name="Unknown" offset="2" visible="True" />
<short name="Unknown" offset="4" visible="True" />
<short name="Unknown" offset="6" visible="True" />
<short name="Unknown" offset="8" visible="True" />
</reflexive>
<reflexive name="Sound Permutations" offset="32" visible="true" size="12" label="">
<short name="Unknown" offset="0" visible="True" />
<short name="Unknown" offset="2" visible="True" />
<byte name="Unknown" offset="4" visible="True" />
<byte name="Chunk" offset="5" visible="True" />
<short name="Unknown" offset="6" visible="True" />
<short name="Sound Choices Index" offset="8" visible="True" />
<short name="chunkCount" offset="10" visible="True" />
</reflexive>
<reflexive name="Sound Choices" offset="40" visible="true" size="16" label="">
<int name="Name Index" offset="0" visible="True" />
<short name="Unknown" offset="4" visible="False" />
<short name="Unknown" offset="6" visible="False" />
<int name="Unknown" offset="8" visible="False" />
<short name="Sound Chunk Index" offset="12" visible="True" />
<short name="chunkCount" offset="14" visible="True" />
</reflexive>
<reflexive name="Unknown" offset="48" visible="false" size="52" label="">
<unused offset="0" size="20" />
<reflexive name="Unknown53" offset="20" visible="false" size="72" label="">
<float name="One" offset="0" visible="False" />
<unused offset="4" size="4" />
<float name="800" offset="8" visible="False" />
<float name="8000" offset="12" visible="False" />
<unused offset="16" size="24" />
<float name="800" offset="40" visible="False" />
<float name="8000" offset="44" visible="False" />
<unused offset="48" size="24" />
</reflexive>
<unused offset="28" size="24" />
</reflexive>
<reflexive name="Zero" offset="56" visible="false" size="1" label="">
<unused offset="0" size="1" />
</reflexive>
<reflexive name="Sound Raw Data" offset="64" visible="true" size="12" label="">
<int name="Raw Offset" offset="0" visible="True" />
<int name="Size" offset="4" visible="True" />
<int name="Effect" offset="8" visible="True" />
</reflexive>
<reflexive name="Unknown" offset="72" visible="false" size="28" label="">
<reflexive name="Unknown" offset="0" visible="false" size="16" label="">
<short name="Unknown" offset="0" visible="True" />
<short name="Unknown" offset="2" visible="True" />
<float name="Unknown" offset="4" visible="True" />
<float name="Unknown" offset="8" visible="True" />
<float name="Unknown" offset="12" visible="True" />
</reflexive>
<reflexive name="Unknown" offset="8" visible="false" size="4" label="">
<unused offset="0" size="4" />
</reflexive>
<unused offset="16" size="4" />
<unused offset="20" size="8" />
</reflexive>
<reflexive name="Model Raw Data" offset="80" visible="false" size="44" label="">
<unused offset="0" size="8" />
<int name="Offset" offset="8" visible="True" />
<int name="Size" offset="12" visible="True" />
<int name="Header Size" offset="16" visible="True" />
<int name="Data Size" offset="20" visible="True" />
<reflexive name="Resource Blocks" offset="24" visible="true" size="16" label="">
<short name="Unknown" offset="0" visible="True" />
<short name="Unknown" offset="2" visible="True" />
<short name="Unknown" offset="4" visible="True" />
<short name="Chunk Size" offset="6" visible="True" />
<int name="Size" offset="8" visible="True" />
<int name="Offset" offset="12" visible="True" />
</reflexive>
<ident name="Ugh!" offset="32" visible="True" />
<float name="Constant" offset="36" visible="True" />
<float name="Constant" offset="40" visible="True" />
</reflexive>
Code: Select all
Notes:
The sound tag is very small 20 bytes. In it it contains indexes to loads of data. Sound Raw
is based on 3 main compressions ADPMC, OGG? and WMA, and 3 formats Mono 22050kbps,
Stero 44100kbps, and WMA Specific. It also contains an index into the Sound Permutations
reflexive in the coconuts tag. From there you can get all the sound chunks. It also contains
indexes into other unknown reflexives.
Sounds were probably the most enjoyable piece of Halo 2 to work on. They entwine with
an “ugh!” object named “I’ve got a lovely bunch of coconuts”, a song done by the amazing
comedic group Monty Python. I cannot help but believe this system was done as an easter
egg designed just for me as “the curious modder”. To Bungie, I thank you (unless of course
this was designed to keep us from removing sounds, in which case I sincerely apologize.) - Iron Forge
<bitmask16 name="Flags" offset="0" visible="true">
<option name = "Split into permutations" value="1"/>
<option name = "3rd Person?" value="10"/>
<option name = "3rd Person?" value="11"/>
<option name = "Unknown" value="12"/>
</bitmask16>
<short name="Sound Class" offset="2" visible="True" />
<enum8 name="Format" offset="4" visible="True" >
<option name = "Mono 22050kbps" value="0"/>
<option name = "Stero 44100kbps" value="1"/>
<option name = "WMA Specific" value="2"/>
</enum8>
<enum8 name="Compression" offset="4" visible="True" >
<option name = "none" value="0"/>
<option name = "xbox adpcm" value="1"/>
<option name = "ima adpcm?" value="2"/>
<option name = "ogg?" value="3"/>
<option name = "WMA" value="4"/>
</enum8>
<short name="Index to Sound Properties" offset="6" visible="true" />
<short name="Index to Sound Permutations" offset="8" visible="True" />
<byte name="Permutation Chunk Count" offset="10" visible="True" />
<byte name="Index to Sound Unknown17" offset="11" visible="true" />
<short name="Index to Something" offset="6" visible="true" />
<short name="Index to Combat Dialog Raw" offset="8" visible="True" />
<int name="Index to Something" offset="16" visible="true" />
Code: Select all
Notes:
Model Raw is based on 7 blocks, deal with compressed verticies. Currently
there is only 1 Unknown resource block.
Models in Halo 2 use a compressed format based on a bounding box. This bounding
box can be found in the first reflexive of the model meta. Using its constraints for each
value relevant to the models, the uncompressed value can be found using the formula
(((shortValue + 32768) / 65535) * (maxValue – minValue)) + minValue.
The model raw data block now contains a header, footer, and several resource chunks.
The header contains information regarding how many chunks are in each resource block,
allowing you to determine which block contains the information needed (for example, if a
given block has 0 chunks, then it will not have a corresponding resource block). The important
resource blocks are the mesh information block (containing mesh information), the indices
block (containing the indices for the triangle strip), the vertices block (containing at minimum
3 shorts defining the x, y, and z of the vertices), the UV map (containing the compressed
UV points.), and the bone map. - Iron Forge
Raw Layout:
0) Header
BlockStart - Chars(4)
DataSize - Int32
Unknown - Int32[8] //Has todo with chunk counts for other blocks
IndiceCount - Int32
Unknown - Int32[4] //Has todo with chunk counts for other blocks
UnknownBlockChunkCount - Int32
Unknown - Int32[10] //Has todo with chunk counts for other blocks
BoneMapCount - Int32
Unknown - Int32[2]
1) Mesh Info
Unknown - Int32
Loop
ShaderIndex - Int16
IndiceStart - Int16
IndiceCount - Int16
End Loop
2) Indice Block
Loop
Indice - Int16
End Loop
3) Unknown Block
Loop
Unknown - Int32
++28
End Loop
4) Verticies
Loop
X - Int16
Y - Int16
Z - Int16
BoneIndex - Byte
BoneIndex - Byte
End Loop
5) UV Data
Loop
X - Int16
Y - Int16
End Loop
6) Normals
Loop
Normal - Int32
End Loop
7) Bone Maps
Loop
BoneMap - Byte
End Loop
Code: Select all
Notes:
Decorator raw one of the only completely mapped raw formats, yet one of the least
cared about. Decorator raw is very straight forward. All info found in the tags raw
can be found be found in the meta too. The raw only has one resource block, Verticies.
Raw Layout:
0) Header
BlockStart - Chars(4)
DataSize - Int32
//Details on Data, have yet to research this
1) Verticie Block
Loop
X - Float
Y - Float
Z - Float
NormalI - Float
NormalJ - Float
NormalK - Float
TangentI - Float
TangentJ - Float
TangentK - Float
BinormalI - Float
BinormalJ - Float
BinormalK - Float
U - Float
V - Float
End Loop
Code: Select all
Notes:
Particle mode raw is almost exactly the same as decorator raw. All the info
in the raw can be found in the meta, it has only one resource block verticies.
The layout is almost the same(it could be the same, I have yet to make a PRMT
viewer so I don't know), the only difference is that the tangents and binormals
are switched.
Raw Layout:
0) Header
BlockStart - Chars(4)
DataSize - Int32
//Details on Data, have yet to research this
1) Verticie Block
Loop
X - Float
Y - Float
Z - Float
NormalI - Float
NormalJ - Float
NormalK - Float
BinormalI - Float
BinormalJ - Float
BinormalK - Float
TangentI - Float
TangentJ - Float
TangentK - Float
U - Float
V - Float
End Loop
Code: Select all
Notes:
Weather raw surprisingly has NEVER been researched in any way, at least not to my knowledge.
So I decided to take a looksy yesterday. It seems simple 2 resource blocks, but each one
consists of blocks of 4 floats. Which I don't understand, so I'll leave that up to someone smarter
at models then me. Here is the basic layout for you guys.
Raw Layout:
0) Header
BlockStart - Chars(4)
DataSize - Int32
Unknown - Int32
1) Unknown Block
Loop
Unknown - Float
Unknown - Float
Unknown - Float
Unknown - Float
Null - Int32
End Loop
2) Verticie Block?
++12
Loop
Unknown - Float
Unknown - Float
Unknown - Float
Unknown - Float
++16
End Loop
Code: Select all
Notes:
Almost nothing is know about animation raw, although one team has figured it out
I doubt they will release anything. I have gather some info based on their findings.
Firstly, animations use 9 codecs, all of them i believe have different compression
methods, and some have no compression at all. Halo 2 Vista's map editor dumps a
text file called animation_compression_stats.txt which contains a lot of valuable
information regarding animation compression. - Choking Victim
The text file also contains a small diagram of individual animations within an animation
tag. The below picture is a diagram of the warthog animation.
http://zteam.halotrialmods.org/images/1-16-08/anim_compression.jpg
This diagram shows the animations size within the raw data, static node information
(nodes that don't move throughout an animation), and normal animation information. - Choking Victim
CODEC #0 _no_compression_codec AVERAGE KEY RATIOS Rot:1.00, Trs:1.00, Scl:1.00
CODEC #1 _uncompressed_static_data_codec AVERAGE KEY RATIOS Rot:1.00, Trs:1.00, Scl:1.00
CODEC #2 _uncompressed_animated_data_codec AVERAGE KEY RATIOS Rot:1.00, Trs:1.00, Scl:1.00
CODEC #3 _8byte_quantized_rotation_only_codec AVERAGE KEY RATIOS Rot:1.00, Trs:1.00, Scl:1.00
CODEC #4 byte_keyframe_lightly_quantized AVERAGE KEY RATIOS Rot:0.22, Trs:0.26, Scl:1.00
CODEC #5 word_keyframe_lightly_quantized AVERAGE KEY RATIOS Rot:1.00, Trs:1.00, Scl:1.00
CODEC #6 reverse_byte_keyframe_lightly_quantized AVERAGE KEY RATIOS Rot:0.27, Trs:0.64, Scl:0.12
CODEC #7 reverse_word_keyframe_lightly_quantized AVERAGE KEY RATIOS Rot:0.07, Trs:0.14, Scl:1.00
CODEC #8 _blend_screen_codec AVERAGE KEY RATIOS Rot:1.00, Trs:1.00, Scl:1.00
Raw Layout:
CompressionMethod - Byte
RotatedNodesCount - Byte
MovedNodesCount - Byte
ScaledNodesCount - Byte
Unknown - Byte[4]
AnimationRate - Float
Unknown - Int32?
AnimationDataSize - Int32
Unknown - Int32
Unknown - Int32
Unknown - Int32
Loop RotatedNodesCount
I - Float
J - Float
k - Float
D - Float
End Loop
//Data todo with bone rotations
Unknown - Int32
Unknown - Int32
Unknown - Int32
Code: Select all
Notes:
Collision has no raw data per say, it is all in the meta. It is simple verticies with bounding
spheres. It is pretty much completed though.
<struct name="Regions" offset="28" visible="true" size="12" label="">
<stringid name="Peice" offset="0" visible="True" />
<struct name="Premutations" offset="4" visible="true" size="20" label="">
<stringid name="Premutation" offset="0" visible="True" />
<struct name="BSP" offset="4" visible="true" size="68" label="">
<undefined name="BSP" offset="0" visible="True" />
<struct name="3D Nodes" offset="4" visible="true" size="8" label="">
<short name="Plane" offset="0" visible="False" />
<short name="First Child" offset="2" visible="False" />
<byte name="Unknown" offset="4" visible="False" />
<short name="Second Child" offset="5" visible="False" />
<byte name="Unknown" offset="7" visible="False" />
</struct>
<struct name="Planes" offset="12" visible="true" size="16" label="">
<undefined name="i" offset="0" visible="True" />
<undefined name="I" offset="4" visible="True" />
<undefined name="k" offset="8" visible="True" />
<undefined name="d" offset="12" visible="True" />
</struct>
<struct name="Leaves" offset="20" visible="true" size="4" label="">
<byte name="Flags" offset="0" visible="True" />
<byte name="2D Ref" offset="1" visible="True" />
<short name="Refrence count" offset="2" visible="True" />
</struct>
<struct name="2D Refrences" offset="28" visible="true" size="4" label="">
<short name="Plane" offset="0" visible="True" />
<short name="Node" offset="2" visible="True" />
</struct>
<struct name="Planes" offset="36" visible="true" size="16" label="">
<undefined name="Plane i" offset="0" visible="True" />
<undefined name="Plane j" offset="4" visible="True" />
<undefined name="Plane k" offset="8" visible="True" />
<short name="Left Child" offset="12" visible="True" />
<short name="Right Child" offset="14" visible="True" />
</struct>
<struct name="Surfaces" offset="44" visible="true" size="8" label="">
<short name="Plane" offset="0" visible="True" />
<short name="First Edge" offset="2" visible="True" />
<byte name="Flags" offset="4" visible="True" />
<byte name="Breakable Surface" offset="5" visible="True" />
<short name="Material" offset="6" visible="True" />
</struct>
<struct name="Edge Buffer" offset="52" visible="true" size="12" label="">
<short name="Start Vertex" offset="0" visible="True" />
<short name="End Vertex" offset="2" visible="True" />
<short name="Forward Edge" offset="4" visible="True" />
<short name="Reverse Edge" offset="6" visible="True" />
<short name="Left Surface" offset="8" visible="True" />
<short name="Right Surface" offset="10" visible="True" />
</struct>
<struct name="Vertices" offset="60" visible="true" size="16" label="">
<undefined name="x" offset="0" visible="True" />
<undefined name="y" offset="4" visible="True" />
<undefined name="z" offset="8" visible="True" />
<int name="First Edge" offset="12" visible="True" />
</struct>
</struct>
<struct name="Unknown" offset="12" visible="false" size="112" label="">
<undefined name="Unknown" offset="0" visible="False" />
<undefined name="Unknown" offset="4" visible="False" />
<unused offset="8" size="4" />
<undefined name="Unknown" offset="12" visible="False" />
<undefined name="Unknown" offset="16" visible="False" />
<undefined name="Unknown" offset="20" visible="False" />
<undefined name="Unknown" offset="24" visible="False" />
<unused offset="28" size="4" />
<undefined name="Unknown" offset="32" visible="False" />
<undefined name="Unknown" offset="36" visible="False" />
<undefined name="Unknown" offset="40" visible="False" />
<unused offset="44" size="4" />
<id name="Unknown" offset="48" visible="False" />
<unused offset="52" size="12" />
<undefined name="Unknown" offset="64" visible="False" />
<undefined name="Unknown" offset="68" visible="False" />
<unused offset="72" size="4" />
<undefined name="Unknown" offset="76" visible="False" />
<undefined name="Unknown" offset="80" visible="False" />
<undefined name="Unknown" offset="84" visible="False" />
<unused offset="88" size="4" />
<undefined name="Unknown" offset="92" visible="False" />
<undefined name="Unknown" offset="96" visible="False" />
<struct name="Unknown" offset="100" visible="false" size="1" label="">
<byte name="Unknown" offset="0" visible="False" />
</struct>
<unused offset="108" size="4" />
</struct>
</struct>
</struct>
Code: Select all
Notes:
Thanks to one of the best modders Neodos, who has recently retired, we can have custom
physics models. Although I do not know much, I do remember some of what he told me. Physics
Models are based on bounding boxes around sections of the model. At a second glance these
could be rendered very easily. The important reflexive that allows for collision in-game is
Physics Boxes. I believe JacksonCougar could offer more info.
<struct name="Physics Boxes" offset="96" visible="True" size="144" label="Physics ID">
<stringid name="Physics Box Name" offset="0" visible="True" />
<float name="Unknown" offset="4" visible="True" />
<float name="Unknown" offset="8" visible="True" />
<float name="Friction" offset="12" visible="True" />
<float name="Bounce Factor" offset="16" visible="True" />
<float name="Volume" offset="20" visible="True" />
<float name="Mass" offset="24" visible="True" />
<float name="Bitmask?" offset="28" visible="True" />
<float name="Bitmask?" offset="32" visible="True" />
<float name="Bitmask?" offset="36" visible="True" />
<float name="Bitmask?" offset="40" visible="True" />
<float name="Unused" offset="44" visible="False" />
<float name="X scale" offset="48" visible="True" />
<float name="Y scale" offset="52" visible="True" />
<float name="Z scale" offset="56" visible="True" />
<float name="Unknown scale?" offset="60" visible="True" />
<float name="Bitmask?" offset="64" visible="True" />
<float name="Bitmask?" offset="68" visible="True" />
<float name="Unused" offset="72" visible="False" />
<float name="Bitmask?" offset="76" visible="True" />
<float name="Yaw 1" offset="80" visible="True" />
<float name="Pitch 1" offset="84" visible="True" />
<float name="Roll 1" offset="88" visible="True" />
<float name="Unused" offset="92" visible="False" />
<float name="Yaw 2" offset="96" visible="True" />
<float name="Pitch 2" offset="100" visible="True" />
<float name="Roll 2" offset="104" visible="True" />
<float name="Unused" offset="108" visible="False" />
<float name="Yaw 3" offset="112" visible="True" />
<float name="Pitch 3" offset="116" visible="True" />
<float name="Roll 3" offset="120" visible="True" />
<float name="Unused" offset="124" visible="False" />
<float name="X position" offset="128" visible="True" />
<float name="Y position" offset="132" visible="True" />
<float name="Z position" offset="136" visible="True" />
<float name="Unknown" offset="140" visible="False" />
</struct>
