Вопрос МодПак

Vadik_2K

Новичок
Когда устанавливаешь свой модпак в игру то файлы некоторые заменяются, а когда удаляешь модпак те файлы которые заменились тоже удаляются, и после приходится игру переустанавливать.
1 Можно ли сделать так когда удаляешь модпак то файлы ворачивались старые.
2 Если не как, то те файлы которые заменились они не удаляются при удаление модпака.
Кидайте варианты.
 

Krinkels

Он где то тут
Администратор
Ну, как вариант, делаешь бэкап заменяемых файлов, а при удалении модпака возвращаешь оригиналы на место
 

Ученик_77

Участник
делаешь бэкап заменяемых файлов
Я знаю только как вручную, но установщик ZOGовских русификаторов сам как-то делает бекапы заменяемого...
Очевидно, речь об этом ?
Vadik_2K, ещё как вариант (я так делал).:$
Пакуете игрушку сразу с папкой оригинальных файлов, которые модпаком заменятся.
Именуете её типа Original_, после сноса мода из неё можно файлы восстановить в игру.
 
Последнее редактирование:

vint56

Ветеран
Проверенный
Vadik_2K, пример от Dodakaedr
Код:
#define MyAppName "My Program"
#define MyAppVersion "1.5"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
OutputDir=.

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "backup"; Description: "Обновить с сохранением текущих настроек"; Flags: unchecked

[Files]
Source: "1.txt"; DestDir: "{app}"; BeforeInstall: "BackupFile()"; Flags: ignoreversion ; Tasks: backup;
Source: "2.txt"; DestDir: "{app}"; BeforeInstall: "BackupFile()"; Flags: ignoreversion ; Tasks: backup;

[code]
type
#ifdef UNICODE
#define A "W"
PChar = PAnsiChar;
#else
#define A "A"
#endif
   TSHFileOpStruct =  record
     Wnd: HWND;
     wFunc: UINT;
     pFrom: PChar;
     pTo: PChar;
     fFlags: Word;
     fAnyOperationsAborted: BOOL;
     hNameMappings: HWND;
     lpszProgressTitle: PChar;
   end;

const
   FO_MOVE            = $0001;
   FO_COPY            = $0002;
   FOF_SILENT         = $0004;
   FOF_NOCONFIRMATION = $0010;
   FOF_FILESONLY      = $0080;
   FOF_NOCONFIRMMKDIR = $0200;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer; external 'SHFileOperation@shell32.dll stdcall';

procedure BackupFile();
var
file, backFile, backpath: string;
begin
if FileExists(ExpandConstant(CurrentFileName)) then
begin
File := ExpandConstant(CurrentFileName);
backpath := file;
StringChangeEx(backpath, ExpandConstant('{app}'), '', True);
backFile := ExpandConstant('{app}\Backup') + backpath;
ForceDirectories(ExtractFilePath(backfile));
RenameFile(file, backfile);
end;
end;

function BackupDir(const fromDir, toDir: ansistring; IsMove: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: ansistring;
  SR: TFindRec;
  res: Boolean;
begin
    ForceDirectories(toDir);
  if IsMove then
    fos.wFunc  := FO_MOVE else
    fos.wFunc  := FO_COPY;
    fos.fFlags := FOF_FILESONLY or FOF_SILENT or
               FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    _fromDir:= AddBackslash(fromDir);
    _toDir  := AddBackslash(toDir);
  if (Length(fromDir) = Length(_fromDir)) then
    begin
        res:= FindFirst(_fromDir + '*', SR);
      try
        while res do
        begin
          if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end else
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir   + SR.Name + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end;
                Result := (0 = ShFileOperation(fos));
                _fromDir:= ExtractFilePath(_fromDir);
                _toDir:= ExtractFilePath(_toDir);
          end;
          res := FindNext(SR);
        end;
      finally
        FindClose(SR);
      end;
    end else
    begin
      _fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
      _toDir  := RemoveBackslashUnlessRoot(_toDir)   + #0#0;
      fos.pFrom  := PChar(_fromDir);
      fos.pTo    := PChar(_toDir);
      Result := (0 = ShFileOperation(fos));
    end;
end;

procedure RestoreBackup(backDir: string);
begin
BackupDir(backDir, ExpandConstant('{app}'), True);
DelTree(backDir, true, true, true);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usdone then
begin
RestoreBackup(ExpandConstant('{app}\Backup\'));
end;
end;
 

SBalykov

Старожил
Вообще-то, все это есть в справке Inno:
Код:
[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg

[Code]
var
MyTask: TCheckBox;

function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
var
FindFiles: TFindRec;
i: integer;
MyFiles: array of string;
MyDir, BackDir: string;
begin
if CurStep=ssInstall then begin
if MyTask.Checked then begin
MyFiles:=['TS3.exe','gameplay.package','*.precomp','*.jpg']; ///указать файлы или маски нужные для бакупа через запятую. при указании маски '*' бакупятся все файлы с вложенными папками
MyDir:=ExpandConstant('{app}'+'\Game\Bin\'); ///папка откуда бакупить
BackDir:=ExpandConstant('{app}'+'\Backup\'); ///папка куда бакупить
for i:=0 to GetArrayLength(MyFiles)-1 do
begin
if FindFirst(MyDir+MyFiles[i], FindFiles) then begin
repeat
if not DirExists(BackDir) then begin
CreateDir(BackDir);
end;
MoveFile(MyDir+ FindFiles.Name, BackDir+FindFiles.Name);
until not FindNext(FindFiles);
FindClose(FindFiles);
end;
end;
end;
end;
end;

procedure InitializeWizard();
begin
MyTask:=TCheckBox.Create(WizardForm);
with MyTask do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Сделать Бэкап';
Left:=ScaleX(0);
Top:=ScaleY(100);
Width:=ScaleX(400);
Height:=ScaleY(15);
TabOrder:=0;
Checked:=True;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
FindFiles: TFindRec;
MyDir, BackDir: string;
begin
if CurUninstallStep = usPostUninstall then begin
MyDir:=ExpandConstant('{app}'+'\Game\Bin\'); ///папка куда возвращать файлы
BackDir:=ExpandConstant('{app}'+'\Backup\'); ///папка откуда брать файлы
if DirExists(BackDir) then begin
if MsgBox('Восстановить данные из бэкапа?', mbConfirmation, MB_YESNO) = IDYES then begin
if FindFirst(BackDir+'*', FindFiles) then begin
repeat
MoveFile(BackDir+ FindFiles.Name, MyDir+FindFiles.Name);
until not FindNext(FindFiles);
FindClose(FindFiles);
RemoveDir(BackDir);
end;
end;
end;
end;
end;
 
Сверху