From fae731a9dde50d4904021ffdb7b01d9d3e7488e5 Mon Sep 17 00:00:00 2001 From: Eddoursul Date: Tue, 24 Oct 2023 17:06:00 +0200 Subject: [PATCH] Updated IsSameCellPackage --- ESMify_Plugins.pas | 83 +++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/ESMify_Plugins.pas b/ESMify_Plugins.pas index 5257779..a165681 100644 --- a/ESMify_Plugins.pas +++ b/ESMify_Plugins.pas @@ -34,8 +34,8 @@ begin sig := Signature(referencingRecord); // Locational links are bi-directional, this script does not process them. To fix them, resave plugin in CK. - // WRLD records may refer to REFRs if they are large references. Being a large reference does not imply necessity of the persistence flag. - // TES4 may refer to REFRs if they are listed in ONAM. To keep ONAM up to date, enable "Always save ONAM" in xEdit. + // WRLD records usually refer to large reference REFRs. Being a large reference does not imply necessity of the persistence flag. + // TES4 refers to REFRs if they are listed in ONAM. To keep ONAM up to date, enable "Always save ONAM" in xEdit. if (sig = 'LCTN') or (sig = 'WRLD') or (sig = 'TES4') then continue; @@ -45,7 +45,6 @@ begin if GetLoadOrder(GetFile(referencingRecord)) <= GetLoadOrder(GetFile(rec)) then begin // When referencing record is not referenced and it's in the same cell, the ref does not need persistence. - // Does not cover long chains of linked refs. if (ReferencedByCount(referencingRecord) = 0) then begin if (sig = 'REFR') then begin if InSameCell(rec, referencingRecord) then continue; @@ -181,45 +180,55 @@ begin end; end; -function IsSameCellPackage(package: IwbMainRecord): boolean; +function IsSameCellPackage(inputValues: IwbElement): boolean; var - packageLoc, packageType: string; + packageLoc: string; + inputVal: IwbElement; refCell, linkedRefKeyword, linkedRef: IwbMainRecord; + i: integer; begin - packageLoc := GetElementEditValues(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PLDT\Type'); + result := True; - if packageLoc <> '' then begin - - if (packageLoc = 'Near editor location') or (packageLoc = 'Near self') then begin - //AddMessage(' Skipping editor location actor: ' + GetElementEditValues(e, 'NAME') + ' - (' + Name(e) + ')'); - continue; - end - else if (packageLoc = 'In cell') then begin - refCell := LinksTo(ElementByPath(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PLDT\Cell')); - if Assigned(refCell) then begin - if SameRecord(refCell, LinksTo(ElementByPath(e, 'Cell'))) then continue; + for i := 0 to Pred(ElementCount(inputValues)) do begin + inputVal := ElementByIndex(inputValues, i); + packageLoc := GetElementEditValues(inputVal, 'PLDT\Type'); + + if packageLoc <> '' then begin + + if (packageLoc = 'Near editor location') or (packageLoc = 'Near self') then begin + //AddMessage(' Skipping editor location actor: ' + GetElementEditValues(e, 'NAME') + ' - (' + Name(e) + ')'); + continue; + end + else if (packageLoc = 'In cell') then begin + refCell := LinksTo(ElementByPath(inputVal, 'PLDT\Cell')); + if Assigned(refCell) then begin + if SameRecord(refCell, LinksTo(ElementByPath(e, 'Cell'))) then continue; + end; + end + else if (packageLoc = 'Near linked reference') then begin + linkedRefKeyword := LinksTo(ElementByPath(inputVal, 'PLDT\Keyword')); + if not IsLinkedRefRemote(e, linkedRefKeyword) then continue; + end + else if (packageLoc = 'Near reference') then begin + if InSameCell(e, LinksTo(ElementByPath(inputVal, 'PLDT\Reference'))) then continue; end; + end - else if (packageLoc = 'Near linked reference') then begin - linkedRefKeyword := LinksTo(ElementByPath(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PLDT\Keyword')); - if not IsLinkedRefRemote(e, linkedRefKeyword) then continue; - end - else if (packageLoc = 'Near reference') then begin - if InSameCell(e, LinksTo(ElementByPath(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PLDT\Reference'))) then continue; + else begin + packageLoc := GetElementEditValues(inputVal, 'PTDA\Target Data\Type'); + + if (packageLoc = 'Linked Reference') then begin + linkedRefKeyword := LinksTo(ElementByPath(inputVal, 'PTDA\Target Data\Reference')); + if not IsLinkedRefRemote(e, linkedRefKeyword) then continue; + end + else if (packageLoc = 'Specific Reference') then begin + linkedRef := LinksTo(ElementByPath(inputVal, 'PTDA\Target Data\Reference')); + if InSameCell(e, linkedRef) then continue; + end; end; - end - else begin - packageLoc := GetElementEditValues(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PTDA\Target Data\Type'); - - if (packageLoc = 'Linked Reference') then begin - linkedRefKeyword := LinksTo(ElementByPath(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PTDA\Target Data\Reference')); - if not IsLinkedRefRemote(e, linkedRefKeyword) then continue; - end - else if (packageLoc = 'Specific Reference') then begin - linkedRef := LinksTo(ElementByPath(ElementByIndex(ElementByPath(package, 'Package Data\Data Input Values'), 0), 'PTDA\Target Data\Reference')); - if InSameCell(e, linkedRef) then continue; - end; + result := False; + break; end; end; @@ -240,7 +249,7 @@ begin // DLZM and DCZM Default Objects. // For simplicity sake, I assume they are unchanged, which is true in 99.999% cases. - // If you ever find a mod, changing these objects, I will update this to retrieve actual values. + // If you ever find a mod, changing these objects, update this to retrieve actual values. hardcodedStatForms.Add($138C0); // DragonMarker hardcodedStatForms.Add($3DF55); // DragonMarkerCrashStrip end; @@ -250,7 +259,7 @@ var currentPlugin: IwbFile; baseRefRecord, package, actorLocation: IwbMainRecord; packages: IwbElement; - i, baseID, packageCount, typeId: integer; + i, j, baseID, packageCount, typeId: integer; sig, baseSig: string; isREFR, isACHR, skip: boolean; begin @@ -388,7 +397,7 @@ begin continue; end; - if (IsSameCellPackage(package)) then continue; + if (IsSameCellPackage(ElementByPath(package, 'Package Data\Data Input Values'))) then continue; skip := false; break;