public PssgNode(PssgBinaryReader reader, PssgFile file, PssgNode node, bool useDataNodeCheck)
{
this.file = file;
ParentNode = node;
id = reader.ReadInt32();
size = reader.ReadInt32();
long end = reader.BaseStream.Position + size;
attributeSize = reader.ReadInt32();
long attributeEnd = reader.BaseStream.Position + attributeSize;
if (attributeEnd > reader.BaseStream.Length || end > reader.BaseStream.Length)
{
throw new Exception("This file is improperly saved and not supported by this version of the PSSG editor." + Environment.NewLine + Environment.NewLine +
"Get an older version of the program if you wish to take out its contents, but, put it back together using this program and a non-modded version of the pssg file.");
}
// Each attr is at least 8 bytes (id + size), so take a conservative guess
attributes = new Dictionary<string, PssgAttribute>();
PssgAttribute attr;
while (reader.BaseStream.Position < attributeEnd)
{
attr = new PssgAttribute(reader, file, this);
attributes.Add(attr.Name, attr);
}
switch (Name)
{
case "BOUNDINGBOX":
case "DATA":
case "DATABLOCKDATA":
case "DATABLOCKBUFFERED":
case "INDEXSOURCEDATA":
case "INVERSEBINDMATRIX":
case "MODIFIERNETWORKINSTANCEUNIQUEMODIFIERINPUT":
case "NeAnimPacketData_B1":
case "NeAnimPacketData_B4":
case "RENDERINTERFACEBOUNDBUFFERED":
case "SHADERINPUT":
case "TEXTUREIMAGEBLOCKDATA":
case "TRANSFORM":
isDataNode = true;
break;
}
if (isDataNode == false && useDataNodeCheck == true)
{
long currentPos = reader.BaseStream.Position;
// Check if it has subnodes
while (reader.BaseStream.Position < end)
{
int tempID = reader.ReadInt32();
if (tempID > file.nodeInfo.Length || tempID < 0)
{
isDataNode = true;
break;
}
else
{
int tempSize = reader.ReadInt32();
if ((reader.BaseStream.Position + tempSize > end) || (tempSize == 0 && tempID == 0) || tempSize < 0)
{
isDataNode = true;
break;
}
else if (reader.BaseStream.Position + tempSize == end)
{
break;
}
else
{
reader.BaseStream.Position += tempSize;
}
}
}
reader.BaseStream.Position = currentPos;
}
if (isDataNode)
{
data = reader.ReadBytes((int)(end - reader.BaseStream.Position));
}
else
{
// Each node at least 12 bytes (id + size + arg size)
subNodes = new PssgNode[(end - reader.BaseStream.Position) / 12];
int nodeCount = 0;
while (reader.BaseStream.Position < end)
{
subNodes[nodeCount] = new PssgNode(reader, file, this, useDataNodeCheck);
nodeCount++;
}
Array.Resize(ref subNodes, nodeCount);
}
file.nodeInfo[id - 1].isDataNode = isDataNode;
}