public static void DeleteField(Record root, uint recordId, B4S fieldType) { var q = from record in FindRecords(root).AsParallel() where record.Id == recordId from field in record.Fields where field.FieldType == fieldType select(record, field); var(foundRecord, foundField) = q.First(); foundRecord.Fields.Remove(foundField); foundRecord.CompressedFieldData = null; }
private static bool FieldsAreIdentical(B4S recordType, Field f1, Field f2) { // clear out unused bytes before doing the check. switch (f1.FieldType) { case _CTDA: if (recordType != IDLE) { goto default; } f1 = new Field(f1); f2 = new Field(f2); MBitConverter.Set(f1.Payload, 0, (uint)f1.Payload[0]); MBitConverter.Set(f2.Payload, 0, (uint)f2.Payload[0]); MBitConverter.Set(f1.Payload, 10, (ushort)0); MBitConverter.Set(f2.Payload, 10, (ushort)0); // TODO: ugh, [IDLE:00013344]'s field is apparently allowed // to differ non-trivially. goto default; case _ENAM: if (f1.Payload.LongLength != f2.Payload.LongLength) { return(false); } if (recordType != IDLE) { goto default; } // ENAM is apparently case-insensitive, according to xEdit. f1 = new Field(f1); f2 = new Field(f2); for (long i = 0; i < f1.Payload.LongLength; i++) { f1.Payload[i] = unchecked ((byte)(f1.Payload[i] & 0xDF)); f2.Payload[i] = unchecked ((byte)(f1.Payload[i] & 0xDF)); } goto default; default: return(f1.Payload.SequenceEqual(f2.Payload)); } }