Advertisement
Guest User

Skyrim SE - Renumber and update FormIDs records

a guest
Apr 21st, 2022
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. {
  2. Renumber FormIDs of selected records starting from provided value and updates references
  3. }
  4. unit UserScript;
  5.  
  6. var
  7. NewFormID: Cardinal;
  8.  
  9. function Initialize: integer;
  10. begin
  11. NewFormID := 0;
  12. end;
  13.  
  14. function Process(e: IInterface): integer;
  15. var
  16. OldFormID: Cardinal;
  17. m: IInterface;
  18. s: string;
  19. begin
  20. // file header doesn't have formid
  21. if Signature(e) = 'TES4' then
  22. Exit;
  23.  
  24. OldFormID := GetLoadOrderFormID(e);
  25.  
  26. if NewFormID = 0 then begin
  27. Result := 1;
  28. s := InputBox('Enter', 'New starting FormID', IntToHex64(OldFormID, 8));
  29. if s = '' then
  30. Exit;
  31. NewFormID := StrToInt64('$' + s);
  32. end;
  33.  
  34. Result := 0;
  35.  
  36. if NewFormID = OldFormID then
  37. Exit;
  38.  
  39. // here we shoud check for availability of NewFormID, but it will generate error and abort anyway if that happens
  40. // ...
  41.  
  42. // the record in question might originate from master file
  43. m := MasterOrSelf(e);
  44.  
  45. // skip overridden records
  46. if not Equals(m, e) then
  47. Exit;
  48.  
  49. AddMessage(Format('Changing FormID from [%s] to [%s] on %s', [IntToHex64(OldFormID, 8), IntToHex64(NewFormID, 8), Name(e)]));
  50.  
  51. // first change formid of references
  52. while ReferencedByCount(m) > 0 do
  53. CompareExchangeFormID(ReferencedByIndex(m, 0), OldFormID, NewFormID);
  54.  
  55. // change formid of record
  56. SetLoadOrderFormID(e, NewFormID);
  57.  
  58. // increment formid
  59. Inc(NewFormID);
  60.  
  61. end;
  62.  
  63. end.
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement