public TreeNode[] loadTreeReflexives(int metaOffset, object[] items, bool enabled)
{
List<TreeNode> tns = new List<TreeNode>();
foreach (object o in items)
{
if (o is IFPIO.Reflexive)
{
IFPIO.Reflexive IFPR = (IFPIO.Reflexive)o;
TreeNode tn = new TreeNode(IFPR.name);
reflexiveData rd = new reflexiveData();
tn.Tag = rd;
rd.node = tn;
rd.reflexive = IFPR;
tn.ForeColor = Color.LightGray;
tn.Name = IFPR.name;
tn.ToolTipText = "Offset: " + rd.reflexive.offset.ToString();
if (enabled)
{
map.BR.BaseStream.Position = IFPR.offset + metaOffset;
rd.chunkCount = map.BR.ReadInt32();
if (rd.chunkCount > 0)
{
rd.chunkSelected = 0;
tn.ForeColor = Color.Black;
rd.baseOffset = map.BR.ReadInt32() - meta.magic;
// Some listings are actually in other tags!
// Check [BLOC] "objects\\vehicles\\wraith\\garbage\\wing_boost\\wing_boost"
// > attachments[0] = [BLOC] "objects\\vehicles\\ghost\\garbage\\seat\\seat"
rd.inTagNumber = map.Functions.ForMeta.FindMetaByOffset(rd.baseOffset);
if (rd.inTagNumber == -1)
{
tn.ToolTipText = "DATA ERROR! Possibly corrupt data or incorrect plugin.";
rd.chunkCount = 0;
rd.chunkSelected = -1;
continue;
}
if (rd.inTagNumber == meta.TagIndex)
rd.baseOffset -= meta.offset;
else
{
tn.ForeColor = Color.Red;
tn.ToolTipText = "Data Source Located in:\n[" + map.MetaInfo.TagType[rd.inTagNumber].ToLower() +
"] " + map.FileNames.Name[rd.inTagNumber].ToLower();
}
}
}
tn.Text += " [" + rd.chunkCount.ToString() + "]";
refData.Add(rd);
// Add if non-existant, otherwise update Text
if (rd.inTagNumber == meta.TagIndex)
tn.Nodes.AddRange(loadTreeReflexives(meta.offset + rd.baseOffset + rd.chunkSelected * rd.reflexive.chunkSize, IFPR.items, rd.chunkCount != 0));
else
tn.Nodes.AddRange(loadTreeReflexives(rd.baseOffset + rd.chunkSelected * rd.reflexive.chunkSize, IFPR.items, rd.chunkCount != 0));
if (rd.chunkCount != 0 | !cbHideUnused.Checked)
tns.Add(tn);
}
}
return tns.ToArray();
}