{ Create patch plugin with "No Respawn" flag on references. } unit FindRespawningItems; var plugin: IInterface; bNewFile: bool; bSkipSection: bool; sFormType: string; function Initialize: Integer; begin if not InputQuery('Filter By Form', 'WEAP, ARMO, etc.', sFormType) then Exit; if sFormType = '' then Exit; bNewFile := False; if MessageDlg('Create a new plugin [YES] or set flags, modifying source files [NO]?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then bNewFile := True; end; function HasScript(e: IInterface; aScript: string): Boolean; var i: integer; begin if Name(e) = 'scriptName' then begin Result := SameText(GetEditValue(e), aScript); bSkipSection := True; end else for i := 0 to Pred(ElementCount(e)) do begin Result := HasScript(ElementByIndex(e, i), aScript); if bSkipSection then begin bSkipSection := False; Exit; end; if Result then Exit; end; end; function Process(e: IInterface): Integer; var sFormID: string; r: IInterface; begin // process only references if Signature(e) <> 'REFR' then Exit; // only master references if not IsMaster(e) then Exit; // but work with the current winning override e := WinningOverride(e); // references of activator only if Signature(BaseRecord(e)) <> sFormType then Exit; if GetElementEditValues(e, 'Record Header\Record Flags\No Respawn') = '1' then exit; if bNewFile then begin if not Assigned(plugin) then begin plugin := AddNewFile; if not Assigned(plugin) then begin Result := 1; Exit; end; end; end; try if Assigned(plugin) then begin // add masters before copying as override for parent CELL AddRequiredElementMasters(LinksTo(ElementByIndex(e, 0)), plugin, False); // and REFR itself AddRequiredElementMasters(e, plugin, False); // winning cell override r := WinningOverride(LinksTo(ElementByName(e, 'Cell'))); if GetFile(r) <> plugin then begin AddRequiredElementMasters(r, plugin, False); wbCopyElementToFile(r, plugin, False, True); end; // copy reference as override e := wbCopyElementToFile(e, plugin, False, True); end; // set No Respawn flag SetElementNativeValues(e, 'Record Header\Record Flags\No Respawn', 1); except on Ex: Exception do begin AddMessage('Failed to copy: ' + FullPath(e)); AddMessage(' reason: ' + Ex.Message); end; end; end; function Finalize: integer; begin if Assigned(plugin) then SortMasters(plugin); end; end.