public void CreateVarlink(PNode p1, SVar end) { SBox start = (SBox)p1.Parent.Parent.Parent; IExportEntry startExport = pcc.getExport(start.Index); string linkDesc = null; foreach (VarLink l in start.Varlinks) { if (l.node == p1) { if (l.Links.Contains(end.Index)) return; linkDesc = l.Desc; break; } } if(linkDesc == null) return; var varLinksProp = startExport.GetProperty<ArrayProperty<StructProperty>>("VariableLinks"); if (varLinksProp != null) { foreach (var prop in varLinksProp) { if (prop.GetProp<StrProperty>("LinkDesc") == linkDesc) { prop.GetProp<ArrayProperty<ObjectProperty>>("LinkedVariables").Add(new ObjectProperty(end.Index + 1)); startExport.WriteProperty(varLinksProp); } } } }
public void CreateVarlink(PNode p1, SVar end) { SBox start = (SBox)p1.Parent.Parent.Parent; byte[] buff = pcc.Exports[start.Index].Data; List<byte> ListBuff = new List<byte>(buff); VarLink link = new VarLink(); bool firstLink = false; foreach (VarLink l in start.Varlinks) { if (l.node == p1) { if (l.Links.Contains(end.Index)) return; if (l.Links[0] == -1) { firstLink = true; l.Links.RemoveAt(0); l.offsets.RemoveAt(0); } else { l.offsets.Add(l.offsets[l.offsets.Count -1] + 4); } l.Links.Add(end.Index); link = l; break; } } if(link.Links == null) return; BitConverter.IsLittleEndian = true; List<PropertyReader.Property> p = PropertyReader.getPropList(pcc, buff); int f = -1; for (int i = 0; i < p.Count(); i++) { if (pcc.getNameEntry(p[i].Name) == "VariableLinks") { byte[] sizebuff = BitConverter.GetBytes(BitConverter.ToInt32(p[i].raw, 16) + 4); for (int j = 0; j < 4; j++) { ListBuff[p[i].offsetval - 8 + j] = sizebuff[j]; } f = i; break; } } if (f != -1) { int pos = 28; byte[] global = p[f].raw; int count = BitConverter.ToInt32(global, 24); for(int j = 0; j < count; j++) { List<PropertyReader.Property> p2 = PropertyReader.ReadProp(pcc, global, pos); for (int i = 0; i < p2.Count(); i++) { if (pcc.getNameEntry(p2[i].Name) == "LinkedVariables" && p2[i + 1].Value.StringValue == link.Desc + '\0') { if (firstLink) link.offsets.Add(pos + 28); int count2 = BitConverter.ToInt32(p2[i].raw, 24); byte[] countbuff = BitConverter.GetBytes(count2 + 1); byte[] sizebuff = BitConverter.GetBytes(BitConverter.ToInt32(p2[i].raw, 16) + 4); for(int k = 0; k < 4; k++) { ListBuff[p[f].offsetval + pos + k] = countbuff[k]; ListBuff[p[f].offsetval + pos - 8 + k] = sizebuff[k]; } ListBuff.InsertRange(p[f].offsetval + pos + 4 + count2 * 4, BitConverter.GetBytes(end.Index + 1)); pcc.Exports[start.Index].Data = ListBuff.ToArray(); j = count; //break outer loop break; } pos += p2[i].raw.Length; } } } refreshView(); }