Перейти к содержанию

  • 0
Infest

[RA-Модули] Серия скриптов для xEdit.

Вопрос

В данный момент на нексусе лежат ряд скриптов для xEdit, благодаря которым можно значительно улучшить модули и проект RA в целом. 

По порядку:

 

1. Decompress Records.

Убирает сжатие с записей, на который стоит флаг "Compressed". Вес .esm файлов увеличится, однако при том объёме, который состоит SFW RA, мы значительно можем увеличить прирост производительности и снять нагрузку на движок игры. 

 

2. Disabled LOD Crash Fixer.

Убираем глюченные объекты с флагом "Has Tree LOD", вызывающие вылеты игры. 

 

3. Simple Cell Save Bloat Fixer

Одна из основных проблем игры с большим количеством модов - это раздувание сохранений до неграбельных масштабов. Проблема в том, что все динамические объекты, после того, как ГГ или актор сдвинет их с места, прописывают свои новые координаты в файлах сохранения. Учитывая сколько в SFW-RA интерьеров и экстерьеров, файлы сохранения могут достигать >100 мб. Данный скрипт решает эту проблему тем, что ставит всем динамическим объектам специальный флаг, благодаря которому информация об объектах не сохраняется в игровом мире. Тем самым избавляя файлы сохранения от тонны записываемого туда мусора. 

  • Нравится 2
  • Спасибо! 1

Поделиться сообщением


Ссылка на сообщение

51 ответ на этот вопрос

Рекомендуемые сообщения

  • 0

Ещё 2 скрипта хЭдита:

  1. Установщик DELETED в REFR для Магнума.
  2. Копировалка DT в DR для Братишки-Бульбиана.

 

КОПИРОВАЛКА ДТ В ДР:

 

Спойлер

unit UserScript;

uses
  SysUtils;

var
  cntSeen, cntDone: Integer;
  cntSkipSig, cntSkipUneditable: Integer;
  cntSkipNoDR, cntSkipNoDTPath, cntSkipDTEmpty: Integer;
  cntSkipDTZero, cntSkipDRNonZero: Integer;
  cntFailedWrite: Integer;

function PathOk(e: IInterface; const p: string): Boolean;
begin
  Result := False;
  try Result := Assigned(ElementByPath(e, p)); except Result := False; end;
end;

function FirstDRPath(e: IInterface): string;
begin
  Result := '';
  if PathOk(e, 'DNAM\DR') then begin Result := 'DNAM\DR'; Exit; end;
  if PathOk(e, 'DNAM - Data\DR') then begin Result := 'DNAM - Data\DR'; Exit; end;
end;

function DeriveDTFromDR(const drPath: string): string;
begin
  Result := drPath;
  if Pos('\DR', drPath) > 0 then
    Result := StringReplace(drPath, '\DR', '\DT', [rfReplaceAll]);
end;

function NormalizeNumStr(s: string): string;
var
  t: string;
  p: Integer;
begin
  t := Trim(s);
  t := StringReplace(t, ',', '.', [rfReplaceAll]);

  if (Length(t) > 0) and (t[1] = '+') then
    Delete(t, 1, 1);

  p := Pos('.', t);
  if p > 0 then begin
    while (Length(t) > p) and (t[Length(t)] = '0') do
      Delete(t, Length(t), 1);
    if Length(t) = p then
      Delete(t, p, 1);
  end;

  if t = '' then t := '0';
  if t = '-0' then t := '0';
  Result := t;
end;

function IsZeroStr(s: string): Boolean;
begin
  Result := (NormalizeNumStr(s) = '0');
end;

function Process(e: IInterface): Integer;
var
  drPath, dtPath: string;
  drStr, dtStr: string;
begin
  Result := 0;
  Inc(cntSeen);

  if Signature(e) <> 'ARMO' then begin
    Inc(cntSkipSig);
    Exit;
  end;

  if not IsEditable(e) then begin
    Inc(cntSkipUneditable);
    Exit;
  end;

  drPath := FirstDRPath(e);
  if drPath = '' then begin
    Inc(cntSkipNoDR);
    Exit;
  end;

  dtPath := DeriveDTFromDR(drPath);
  if not PathOk(e, dtPath) then begin
    Inc(cntSkipNoDTPath);
    Exit;
  end;

  dtStr := '';
  drStr := '';
  try dtStr := GetElementEditValues(e, dtPath); except dtStr := ''; end;
  try drStr := GetElementEditValues(e, drPath); except drStr := ''; end;

  if dtStr = '' then begin
    Inc(cntSkipDTEmpty);
    Exit;
  end;

  // Skip: DT=0
  if IsZeroStr(dtStr) then begin
    Inc(cntSkipDTZero);
    Exit;
  end;

  // Skip: DR already non-zero
  if (drStr <> '') and (not IsZeroStr(drStr)) then begin
    Inc(cntSkipDRNonZero);
    Exit;
  end;

  try
    SetElementEditValues(e, drPath, dtStr);
    Inc(cntDone);
  except
    Inc(cntFailedWrite);
  end;
end;

function Initialize: Integer;
begin
  Result := 0;

  cntSeen := 0; cntDone := 0;
  cntSkipSig := 0; cntSkipUneditable := 0;
  cntSkipNoDR := 0; cntSkipNoDTPath := 0; cntSkipDTEmpty := 0;
  cntSkipDTZero := 0; cntSkipDRNonZero := 0;
  cntFailedWrite := 0;
end;

function Finalize: Integer;
begin
  Result := 0;

  AddMessage('---- DT -> DR report ----');
  AddMessage('Seen total: ' + IntToStr(cntSeen));
  AddMessage('Done (written): ' + IntToStr(cntDone));
  AddMessage('Skip (not ARMO): ' + IntToStr(cntSkipSig));
  AddMessage('Skip (not editable): ' + IntToStr(cntSkipUneditable));
  AddMessage('Skip (no DR path): ' + IntToStr(cntSkipNoDR));
  AddMessage('Skip (no DT path next to DR): ' + IntToStr(cntSkipNoDTPath));
  AddMessage('Skip (DT empty/unreadable): ' + IntToStr(cntSkipDTEmpty));
  AddMessage('Skip (DT = 0): ' + IntToStr(cntSkipDTZero));
  AddMessage('Skip (DR already non-zero): ' + IntToStr(cntSkipDRNonZero));
  AddMessage('Failed writes: ' + IntToStr(cntFailedWrite));
end;

end.

 

 

 

УСТАНОВЩИК DELETED ДЛЯ REFR:

 

S44-TRUST-REFR-Deleted.zip

  • Нравится 2
  • Спасибо! 1

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


×
×
  • Создать...