Advertisement
DieFeM

FindSwapsWithMissingMaterials

Aug 17th, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.27 KB | None | 0 0
  1. unit FindSwapsWithMissingMaterials;
  2. var
  3.   slAssets, slMaterialsList: TwbFastStringList;
  4.   f: IInterface;
  5.  
  6. function Initialize: integer;
  7. var
  8.   slContainers: TStringList;
  9.   i: integer;
  10. begin
  11.   f := AddNewFile;
  12.   if Assigned(f) then begin
  13.     AddMasterIfMissing(f, GetFileName(FileByIndex(0)));
  14.     slContainers := TStringList.Create;
  15.     slAssets := TwbFastStringList.Create;
  16.    
  17.     ResourceContainerList(slContainers);
  18.    
  19.     for i := 0 to Pred(slContainers.Count) do
  20.       ResourceList(slContainers[i], slAssets);
  21.    
  22.     slAssets.Sort;
  23.     wbRemoveDuplicateStrings(slAssets);
  24.    
  25.     slMaterialsList := TwbFastStringList.Create;
  26.    
  27.     for i := 0 to Pred(slAssets.Count) do
  28.       if SameText(ExtractFileExt(slAssets[i]), '.BGSM') or SameText(ExtractFileExt(slAssets[i]), '.BGEM') then
  29.         slMaterialsList.Add(slAssets[i]);
  30.     slAssets.Free;
  31.     AddMessage('Assets List Ready.');
  32.   end
  33.   else exit;
  34. end;
  35.  
  36. Function FindMaterialFile(filename: string): string;
  37. var
  38.   i: integer;
  39.   Material: string;
  40. begin
  41.   Material := '';
  42.   for i := 0 to Pred(slMaterialsList.Count) do
  43.     if SameText(ExtractFileName(slMaterialsList[i]), filename) then begin
  44.       Material := slMaterialsList[i];
  45.       break;
  46.     end;
  47.   Result := StringReplace(Material, 'materials\', '', [rfIgnoreCase]);
  48. end;
  49.  
  50. procedure SetFlag(elem: IInterface; flagName: string; flagValue: boolean);
  51. var
  52.   sl: TStringList;
  53.   i: Integer;
  54.   f, f2: Cardinal;
  55. begin
  56.   sl := TStringList.Create;
  57.   sl.Text := FlagValues(elem);
  58.   f := GetNativeValue(elem);
  59.   for i := 0 to Pred(sl.Count) do
  60.     if SameText(sl[i], flagName) then begin
  61.       if flagValue then
  62.         f2 := f or (1 shl i)
  63.       else
  64.         f2 := f and not (1 shl i);
  65.       if f <> f2 then SetNativeValue(elem, f2);
  66.       Break;
  67.     end;
  68.   sl.Free;
  69. end;
  70.  
  71. procedure RemoveMSWPFromReferenced(MSWP: IInterface);
  72. var
  73.   i, j: integer;
  74.   referencedOverride, referenced, el: IInterface;
  75.   sl: TStringList;
  76. begin
  77.   for i := Pred(ReferencedByCount(MSWP)) downto 0 do begin
  78.     referenced := ReferencedByIndex(MSWP, i);
  79.     AddMasterIfMissing(f, GetFileName(GetFile(referenced)));
  80.     referencedOverride := wbCopyElementToFile(referenced, GetFile(MSWP), False, True);
  81.     if ElementExists(referencedOverride, 'XMSP') then
  82.       RemoveElement(referencedOverride, ElementByPath(referencedOverride, 'XMSP'));
  83.     if ElementExists(referencedOverride, 'Model\MODS - Material Swap') then
  84.       Remove(ElementByPath(referencedOverride, 'Model\MODS - Material Swap'));
  85.   end;
  86. end;
  87.  
  88. function Process(e: IInterface): integer;
  89. var
  90.   MSWPOverride, OverrideMaterialSubstitutions, OverrideSubstitution, MaterialSubstitutions: IInterface;
  91.   MaterialFile, BNAM, SNAM, BNAMPath, SNAMPath: string;
  92.   i: integer;
  93.   BNAMFound, SNAMFound: boolean;
  94. begin
  95.   if IsMaster(e) then begin
  96.     if Signature(e) = 'MSWP' then begin
  97.       AddMasterIfMissing(f, GetFileName(GetFile(e)));
  98.       MSWPOverride := wbCopyElementToFile(e, f, False, True);
  99.       MaterialSubstitutions := ElementByPath(e, 'Material Substitutions');
  100.      
  101.       if Assigned(MaterialSubstitutions) then begin
  102.        
  103.         OverrideMaterialSubstitutions := ElementByPath(MSWPOverride, 'Material Substitutions');
  104.        
  105.         for i := 0 to Pred(ElementCount(OverrideMaterialSubstitutions)) do begin
  106.          
  107.           OverrideSubstitution := ElementByIndex(OverrideMaterialSubstitutions, i);
  108.           BNAM := GetElementEditValues(OverrideSubstitution, 'BNAM');
  109.           SNAM := GetElementEditValues(OverrideSubstitution, 'SNAM');
  110.          
  111.           If Assigned(BNAM) then if Assigned(SNAM) then begin
  112.             BNAMPath := 'Materials\' + BNAM;
  113.             SNAMPath := 'Materials\' + SNAM;
  114.             BNAMFound := true;
  115.             SNAMFound := true;
  116.             if not ContainsText(BNAM, '*') then begin
  117.               if ResourceExists(BNAMPath) = false then begin
  118.                 BNAMFound := false;
  119.                 //AddMessage('BNAM Missing Material: ' + BNAM);
  120.                 MaterialFile := FindMaterialFile(ExtractFileName(BNAMPath));
  121.                 if MaterialFile <> '' then begin
  122.                   BNAMFound := true;
  123.                   //AddMessage('Found material file at: ' + MaterialFile);
  124.                   SetElementEditValues(OverrideSubstitution, 'BNAM', MaterialFile);
  125.                 end;
  126.               end;
  127.             end;
  128.            
  129.             if not ContainsText(SNAM, '*') then begin
  130.               if ResourceExists(SNAMPath) = false then begin
  131.                 SNAMFound := false;
  132.                 //AddMessage('SNAM Missing Material: ' + SNAM);
  133.                 MaterialFile := FindMaterialFile(ExtractFileName(SNAMPath));
  134.                 if MaterialFile <> '' then begin
  135.                   SNAMFound := true;
  136.                   //AddMessage('Found material file at: ' + MaterialFile);
  137.                   SetElementEditValues(OverrideSubstitution, 'SNAM', MaterialFile);
  138.                 end;
  139.               end;
  140.             end;
  141.          
  142.             if SNAMFound = false or BNAMFound = false then begin
  143.               RemoveElement(OverrideMaterialSubstitutions, OverrideSubstitution);
  144.             end;
  145.          
  146.           end;
  147.           Inc(i);
  148.         end;
  149.        
  150.         for i := ElementCount(OverrideMaterialSubstitutions) downto 0 do begin
  151.        
  152.           OverrideSubstitution := ElementByIndex(OverrideMaterialSubstitutions, i);
  153.           BNAM := GetElementEditValues(OverrideSubstitution, 'BNAM');
  154.           SNAM := GetElementEditValues(OverrideSubstitution, 'SNAM');
  155.          
  156.           If Assigned(BNAM) then if Assigned(SNAM) then begin
  157.             BNAMPath := 'Materials\' + BNAM;
  158.             SNAMPath := 'Materials\' + SNAM;
  159.             BNAMFound := true;
  160.             SNAMFound := true;
  161.             if not ContainsText(BNAM, '*') then begin
  162.               if ResourceExists(BNAMPath) = false then begin
  163.                 BNAMFound := false;
  164.                 //AddMessage('BNAM Missing Material: ' + BNAM);
  165.                 MaterialFile := FindMaterialFile(ExtractFileName(BNAMPath));
  166.                 if MaterialFile <> '' then begin
  167.                   BNAMFound := true;
  168.                   //AddMessage('Found material file at: ' + MaterialFile);
  169.                   SetElementEditValues(OverrideSubstitution, 'BNAM', MaterialFile);
  170.                 end;
  171.               end;
  172.             end;
  173.            
  174.             if not ContainsText(SNAM, '*') then begin
  175.               if ResourceExists(SNAMPath) = false then begin
  176.                 SNAMFound := false;
  177.                 //AddMessage('SNAM Missing Material: ' + SNAM);
  178.                 MaterialFile := FindMaterialFile(ExtractFileName(SNAMPath));
  179.                 if MaterialFile <> '' then begin
  180.                   SNAMFound := true;
  181.                   //AddMessage('Found material file at: ' + MaterialFile);
  182.                   SetElementEditValues(OverrideSubstitution, 'SNAM', MaterialFile);
  183.                 end;
  184.               end;
  185.             end;
  186.            
  187.             if SNAMFound = false or BNAMFound = false then begin
  188.               RemoveElement(OverrideMaterialSubstitutions, OverrideSubstitution);
  189.             end;
  190.          
  191.           end;
  192.           Inc(i);
  193.         end;
  194.        
  195.         for i := ElementCount(OverrideMaterialSubstitutions) downto 0 do begin
  196.           OverrideSubstitution := ElementByIndex(OverrideMaterialSubstitutions, i);
  197.           BNAM := GetElementEditValues(OverrideSubstitution, 'BNAM');
  198.           SNAM := GetElementEditValues(OverrideSubstitution, 'SNAM');
  199.           If not Assigned(BNAM) or not Assigned(SNAM) then begin
  200.             RemoveElement(OverrideMaterialSubstitutions, OverrideSubstitution);
  201.           end;
  202.         end;
  203.        
  204.         if ConflictAllForElements(MSWPOverride, e, False, False) <= caNoConflict then begin
  205.           Remove(MSWPOverride);
  206.         end
  207.         else begin
  208.           if ElementCount(OverrideMaterialSubstitutions) = 0 then begin
  209.             RemoveMSWPFromReferenced(MSWPOverride);
  210.             SetFlag(ElementByPath(MSWPOverride, 'Record Header\Record Flags'), 'Deleted', true);
  211.           end;
  212.         end;
  213.       end
  214.       else begin
  215.         RemoveMSWPFromReferenced(MSWPOverride);
  216.         SetFlag(ElementByPath(MSWPOverride, 'Record Header\Record Flags'), 'Deleted', true);
  217.       end;
  218.      
  219.     end;
  220.   end;
  221. end;
  222.  
  223. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement