-
-
Save aers/953a50c61b3028bce7e5376e8590abed to your computer and use it in GitHub Desktop.
Unit CountLoadedRefs; | |
Var | |
giTemporaryCount: Integer; | |
giPersistentCount: Integer; | |
giPluginTemporaryCount: Integer; | |
giPluginPersistentCount: Integer; | |
Const | |
gtPersistent = 8; | |
gtTemporary = 9; | |
Procedure IncCount(iTemporaryCount: Integer; iPersistentCount: Integer;); | |
Begin | |
giPluginTemporaryCount := giPluginTemporaryCount + iTemporaryCount; | |
giPluginPersistentCount := giPluginPersistentCount + iPersistentCount; | |
giTemporaryCount := giTemporaryCount + iTemporaryCount; | |
giPersistentCount := giPersistentCount + iPersistentCount; | |
End; | |
// Always count NEW Persistent Refs, never overridden ones | |
// Only count NEW Temporary Refs if new in esp, or previous overload was a master. | |
Function GetRefCount(eCell: IInterface; eCellChildren: IInterface; AGrupType: Integer; bESM: Boolean): Integer; | |
Var | |
eCellGroup: IInterface; | |
iChildIndex: Integer; | |
eChildElement: IInterface; | |
Begin | |
eCellGroup := FindChildGroup(eCellChildren, AGrupType, eCell); | |
Result := 0; | |
for iChildIndex := 0 To ElementCount(eCellGroup) - 1 Do Begin | |
eChildElement := ElementByIndex(eCellGroup, iChildIndex); | |
if (Signature(eChildElement) = 'REFR') or (Signature(eChildElement) = 'ACHR') or (Signature(eChildElement) = 'PHZD') then Begin | |
if AGrupType = gtTemporary Then Begin | |
if not bESM and IsWinningOverride(eChildElement) Then | |
Result := Result + 1; | |
End Else if AGrupType = gtPersistent Then Begin | |
if IsMaster(eChildElement) Then | |
Result := Result + 1; | |
End; | |
End; | |
End; | |
End; | |
Procedure CountRefsInCell(eCell: IInterface; bESM: Boolean); | |
Var | |
eCellChildren: IInterface; | |
iPersistentCount: Integer; | |
iTemporaryCount: Integer; | |
Begin | |
eCellChildren := ChildGroup(eCell); | |
iPersistentCount := GetRefCount(eCell, eCellChildren, gtPersistent, bESM); | |
iTemporaryCount := GetRefCount(eCell, eCellChildren, gtTemporary, bESM); | |
IncCount(iTemporaryCount, iPersistentCount); | |
End; | |
Procedure CountCellSpace(eBlockParent: IInterface; bESM: Boolean); | |
Var | |
eBlock: IInterface; | |
eSubBlock: IInterface; | |
eCell: IInterface; | |
iBlockIndex: Integer; | |
iSubBlockIndex: Integer; | |
iCellIndex: Integer; | |
Begin | |
For iBlockIndex := 0 To ElementCount(eBlockParent) - 1 Do Begin | |
eBlock := ElementByIndex(eBlockParent, iBlockIndex); | |
For iSubBlockIndex := 0 To ElementCount(eBlock) - 1 Do Begin | |
eSubBlock := ElementByIndex(eBlock, iSubBlockIndex); | |
for iCellIndex := 0 To ElementCount(eSubBlock) - 1 Do Begin | |
eCell := ElementByIndex(eSubBlock, iCellIndex); | |
CountRefsInCell(eCell, bESM); | |
End; | |
End; | |
End; | |
End; | |
Function Initialize: Integer; | |
Var | |
eFile: IInterface; | |
eWorlds: IInterface; | |
eWorld: IInterface; | |
eTemporary: IInterface; | |
eCell: IInterface; | |
eCells: IInterface; | |
iFileIndex: Integer; | |
iWorldIndex: Integer; | |
bESM: Boolean; | |
iTotalPluginCount: Integer; | |
Begin | |
giTemporaryCount := 0; | |
giPersistentCount := 0; | |
// | |
For iFileIndex := 0 To FileCount - 1 Do Begin | |
giPluginTemporaryCount := 0; | |
giPluginPersistentCount := 0; | |
eFile := FileByIndex(iFileIndex); | |
bESM := GetIsESM(eFile); | |
CountCellSpace(GroupBySignature(eFile, 'CELL'), bESM); | |
eWorlds := GroupBySignature(eFile, 'WRLD'); | |
For iWorldIndex := 0 To ElementCount(eWorlds) - 1 Do Begin | |
eWorld := ElementByIndex(eWorlds, iWorldIndex); | |
eTemporary := ChildGroup(eWorld); | |
eCell := ElementByName(eTemporary, '<Persistent Worldspace Cell>'); | |
CountRefsInCell(eCell, bESM); | |
CountCellSpace(eWorld, bESM); | |
End; | |
iTotalPluginCount := giPluginPersistentCount + giPluginTemporaryCount; | |
if iTotalPluginCount > 100 then | |
AddMessage(Format( | |
'Found %d temporary and %d persistent (%d total) loaded references in %s.', [giPluginTemporaryCount, giPluginPersistentCount, iTotalPluginCount, Name(eFile)])); | |
End; | |
AddMessage(Format( | |
'Found %d temporary and %d persistent loaded references, for a grand total of %d loaded references.', [giTemporaryCount, giPersistentCount, giTemporaryCount + giPersistentCount] | |
)); | |
End; | |
End. |
Is there a guide on how to run this? I opened xEdit and looked for menu options for running scripts, didn't see any. I'd like to use this script. Could you add a README.md file with a quick HowTo so that people unfamiliar with xEdit can use it? Thanks!
put .pas file into xedit EditScripts folder
in xedit load your stuff then highlight all plugins and select apply script
select this scrip and hit okay and wait till its finished
When it's done how do I see what mods have the most refs?
When it's done how do I see what mods have the most refs?
It should spit out a separate line for every mod that has refs in it. Here are the last few lines when I ran it:
Found 1227 temporary and 4 persistent (1231 total) loaded references in [FE 385] PCE - ELFX PATCH.esp.
Found 184 temporary and 0 persistent (184 total) loaded references in [FE 387] JKs Understone Keep - PCE patch.esp.
Found 163 temporary and 0 persistent (163 total) loaded references in [FE 388] JKs Understone Keep - PCE - ELFX patch.esp.
Found 8597 temporary and 329 persistent (8926 total) loaded references in [E5] DungeonsRevisited.esp.
Found 0 temporary and 106 persistent (106 total) loaded references in [FE 3B7] GLZ-Blacksmith Forge Water patch.esp.
Found 3 temporary and 935 persistent (938 total) loaded references in [EA] Atlas Map Markers.esp.
Found 333 temporary and 11949 persistent (12282 total) loaded references in [EB] DynDOLOD.esp.
Found 8753 temporary and 0 persistent (8753 total) loaded references in [FE 3C5] Synthesis.esp.
Found 505178 temporary and 130505 persistent loaded references, for a grand total of 635683 loaded references.
[03:17] Done: Applying script "count_loaded_refs_in_load_order", Elapsed Time: 03:17
Sorted - sorry. Used latest SSEEDit and 32 bit version, as advised by Aers on Nexus.