-
-
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. |
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
When it's done how do I see what mods have the most refs?