Jump to content
Korean Random
EvilAlex

Создание инсталляторов для модпаков на базе Inno Setup

Recommended Posts

40 минут назад, Kotyarko_O сказал:

Подразумевается использование готового проекта с таким видом или попытка повторить такое с нуля?

Исходник этого скрипта  нашел на просторах

Share this post


Link to post

Short link
Share on other sites
1 minute ago, wasp200486 said:

Исходник этого скрипта  нашел на просторах

Или он неполный, или неправильно его собираете

Share this post


Link to post

Short link
Share on other sites

Помогите скиньте код этой минюшки и что и куда вставить чтобы работало пожалуйста если не сложно:
ruMQVlxJ.png?download=1&name=%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%2031-12-2020%2014:29:22.png или PEorxiVw.png?download=1&name=%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%2030-12-2020%2019:17:10.png

Share this post


Link to post

Short link
Share on other sites

а как добавить моды в один пакет установщика например я добавил но когда установил выбрав одного мода из них установились все моды

Снимок экрана (44).png

Снимок экрана (43).png

Снимок экрана (42).png

Снимок экрана (41).png

19.11.2013 в 01:30, EvilAlex сказал:

Доброго времени суток !

Видел пару раз темы, где люди искали программу или скрипт которые бы собирали моды в одну прогу и после этого могли их устанавливать на выбор !

Нашел на форумах одну вещицу так скажем!

 

Сам скрипт + пара модов для теста:

ScriptModPack.rar 54,3 МБ

 

Программа с помощью которой собирается инсталлятор:

InnoUltra.exe 54 МБ

 

 

Скриншоты:

  Показать содержимое

post-18561-0-02945700-1384824949_thumb.pngpost-18561-0-45215100-1384824949_thumb.pngpost-18561-0-52695300-1384824951_thumb.pngpost-18561-0-74236100-1384824953_thumb.png

 

 

Что нового:

  Показать содержимое

Ver. 2.4.124

- Упростил скрипт.

- добавил определения папки установки если игра была установлена, если же скопирована инсталятор предлагает свой путь.

- обновил Сообщения в инстоляторе.

- внешний вид не менял.

- добавил Лицензию и ФАК.

 

Ver. 2.3

- Добавил в скрипт небольшое описание.

- Добавил скрипт с Сообщениями иснтоллятора и выбор языка.

- Вынес в отдельный скрипт компоненты - моды.

- Внутри есть 2psd

- Вместо ссылки на группу Кран'а теперь логотип нашего форума с сыллкой на негоже)

 

 

Русская справка к версии 5.5.1, автор перевода BagIra, bugron

ISetup.rar 1 MB · 1 565 скачиваний

 

 

"Дополнительные скрипты "

  Показать содержимое

Проверка папки установки:

 


function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
if not FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then
begin
MsgBox('Не верно указана папка World of Tanks!', mbError, MB_OK);
Result := False;
end;
end;
end;

Набор скриптов, библиотек с их использованием (Автор: Kotyarko_O):

Набор скриптов, библиот…нием.rar - 31,12 МБ

 

 

Share this post


Link to post

Short link
Share on other sites

@asterix93 там просто популярные мододелы и всё а что за файлы ?

28.02.2021 в 15:35, asterix93 сказал:

MODER_MP Source Code

 

28.02.2021 в 15:35, asterix93 сказал:

KMP Source Code

 

есть кто нибудь из вас из 2021? который может отвечать на мои вопросы ?

мой вопрос в том, что я использовал эту программу < JMPACK >  и собрал все моды в один пакет но они все устанавливаются сразу мне нужно чтобы они устанавливались отдельно от выбора 
фото доказательство, показанное выше  https://koreanrandom.com/forum/uploads/monthly_2021_02/1138695088_(41).png.9e0c7b5c461ad1c6ab92350e7f47b152.png , обмен сообщениями по почте или в любой социальной сети, если это возможно ( на форуме  неудобно совсем добавить ответ создать тему и так далее ).)

Share this post


Link to post

Short link
Share on other sites

@Hacker_2021 , вам нужно искать профильную тему инструмента, который вы используете. Там и задавать вопросы.

Share this post


Link to post

Short link
Share on other sites
Just now, Hacker_2021 said:

типа справку ?

Типа тему.

 

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

его давно не было в сети посмотрю отписал напишет ли это уже неизвестно 

Share this post


Link to post

Short link
Share on other sites

 

Можно ли сделать отображение на компах где нет русского языка читаемый шрифт?

 

yJF_Wh8zZkQ.jpg.e509d6a32016f97b09a745c8fedbaa25.jpg

 

rLJjLEmxxiE.jpg.deb44b43c48f32c2671bdfff82c8d7c1.jpg

 может шрифт какой прописать? )

Share this post


Link to post

Short link
Share on other sites
27 минут назад, DraugDM сказал:

Можно ли сделать отображение

 

Название этих элементов нужно прописать в CustomMessages

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "eng"; MessagesFile: "compiler:Languages\English.isl"

[CustomMessages]
; Russian
rus.delete=Удалить установленные моды (рекомендуется)
; English
eng.delete=Remove installed mods (recommended)

В секции Code

ExpandConstant('{cm:delete}')
Edited by night_dragon_on
Обновление ...
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites
Только что, night_dragon_on сказал:

 

Название этих элементов нужно прописать в CustomMessages

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "eng"; MessagesFile: "compiler:Languages\English.isl"

[CustomMessages]
; Russian
rus.delete=Удалить установленные моды (рекомендуется)
; English
eng.delete=Remove installed mods (recommended)

В секции Code

ExpandConstant('{cm:delete}')

что то у меня с этой секцией код какие то траблы при компелировании((

2021-03-17_220050.png.08bdf066b69e4e2018981521eba0c633.png

 

 

2021-03-17_220112.png.ca73c2a950a5db3bf4658dbd6abf52ed.png

Share this post


Link to post

Short link
Share on other sites

@DraugDM строку:

ExpandConstant('{cm:delete}')

Нужно было не просто в секцию Code скопировать, а в то место где прописано наименование компонента который требуется перевести.

Вписать взамен этого наименования.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
Только что, night_dragon_on сказал:

@DraugDM строку:

ExpandConstant('{cm:delete}')

Нужно было не просто в секцию Code скопировать, а в то место где прописано наименование компонента который требуется перевести.

Вписать взамен этого наименования.

 

Спасибо дружище! Заработало))

Share this post


Link to post

Short link
Share on other sites

приветствую гуру кодописания ))

Кто то может подсобить с изменением кода. Вот есть код резервного копирования, может кто то изменить так что бы , если встречается еще один файл с таким же именем, то он бекапился на цифру больше, к примеру mmm_back, mmm_back_01, mmm_back_02 и тд и что бы они так же при деинсталляции восстанавливались. По логике первый бекап и есть оригинал, так что достаточно его и восстановить при деинсталяции остальное просто удалить или что бы не мудрить восстанавливать от последнего к первому.

Ну или может у кого готовый рабочий есть под такую задачу, вдруг...:beer:

 


procedure CreateBackup;
var
srcFile, destFile: string;
begin
srcFile:= ExpandConstant(CurrentFileName);
destFile:= srcFile + '.gom_bak';  /// тут по умолчанию расширение ' .bak
DeleteFile(destFile);
RenameFile(srcFile, destFile);
end;

procedure RestoreBackup(backupDir: string);
var
srcFile, destFile: string;
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
begin
APath := AddBackslash(backupDir);
FindResult := FindFirst(APath + '*.gom_bak', FSR); /// тут по умолчанию расширение '*.bak
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
srcFile:= APath + FSR.Name;
destFile:= Copy(srcFile, 0, Length(srcFile)-8); ///тут указано количество символов удаляемых с названия при восстановлении оригинального файла. По умолчанию -4
DeleteFile(destFile);
RenameFile(srcFile, destFile);
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} RestoreBackup(APath + DSR.Name);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);


end;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
RestoreBackup(ExpandConstant('{app}'))

end;
end;


Share this post


Link to post

Short link
Share on other sites
27 minutes ago, ferrat said:

Вот есть код резервного копирования, может кто то изменить так что бы , если встречается еще один файл с таким же именем, то он бекапился на цифру больше, к примеру mmm_back, mmm_back_01, mmm_back_02 и тд и что бы они так же при деинсталляции восстанавливались. По логике первый бекап и есть оригинал, так что достаточно его и восстановить при деинсталяции остальное просто удалить или что бы не мудрить восстанавливать от последнего к первому.

А если пользователь не знает о существовании деинсталлятора и постоянно накатывает поверх того, что у него есть? Тогда индекс может достигнуть и 50, и 100, и больше. Нужна ли такая куча бекапов пользователю, пусть он и не знает о ней?
В таком случае лучше хранить всегда один экземпляр бекапа - последний.

Описанное вами реализовать не сложно. Вопрос в том, действительно ли такая реализация вам нужна)

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
Цитата

А если пользователь не знает о существовании деинсталлятора и постоянно накатывает поверх того, что у него есть? Тогда индекс может достигнуть и 50, и 100, и больше. Нужна ли такая куча бекапов пользователю, пусть он и не знает о ней?
В таком случае лучше хранить всегда один экземпляр бекапа - последний.

Описанное вами реализовать не сложно. Вопрос в том, действительно ли такая реализация вам нужна)

 

Тогда его проблемы, если читать не умеет предостережения и инструкции при установке каких либо пакетов. 

 

Хотя даже при таком варианте это меня не спасает от остатка лишних файлов после деинсталляции.

 

По сути нужно было такое:

 

1) есть игра

2) есть мод , который ставится на чистую игру.

 

И так:

 

Дабы не заниматься тратой времени и не сравнивать кучу файлов, инстал собирается с папок, выборочная установка.

А значит, что в каждом выбранном пункте для установки может содержаться одинаковые но модифицированные файлы.

 

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

 

И тут ситуация вопроса , как все сделать что бы игра после удаления мода приобрела свое перевальное состояние файлов и папок. 

 

Это либо делать полный лист перед установкой папки игры и копируя встречающиеся файлы игры раз бекапить а второй раз перезаписывать, но  дополнительные файлы не входящие в созданный лист игры копировать но не бекапить и перезаписывать, тогда при удалении мода мы , если все верно, получим первоначальное состояние папки игры .

 

Может немного сумбурно, но попробовал описать проблему ))) 

 

И теперь , если этот набор слов, был хоть как то понят, есть ли вариант это реализовать кодом ? И сложно ли это? Если нет, то возможно ли такое в вашем исполнении маэстро ? 

 

 

Edited by ferrat

Share this post


Link to post

Short link
Share on other sites

Добрый день! Возникла у меня одна проблемка надеюсь кто-то поможет. Сделал я в модпаке отображение картинок казалось бы все работает. Но через некий промежуток времени они перестают отображаться и вешають весь инсталятор намертво. Плюс довольно долго запусаеться сам инсталятор. Вот кидаю код может поможете?

[Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    UNDEF_INDEX = -777;
    ALPHA_BLEND_LEVEL = 255; // max=Byte=255

    WS_EX_LAYERED = $80000;
    WS_EX_TRANSPARENT = $20;
    LWA_COLORKEY = 1;
    LWA_ALPHA = 2;
    GWL_EXSTYLE = (-20);


var
    InfoPic: TBitmapImage;
    LastIndex: Integer;
    TempPath: String;
    PicForm: TForm;

type
    COLORREF = DWORD;

function GetCursorPos(var lpPoint: TPoint): BOOL; external '[email protected] stdcall';
function SetLayeredWindowAttributes(Hwnd: THandle; crKey: COLORREF; bAlpha: Byte; dwFlags: DWORD): Boolean; external '[email protected] stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function SetFocus(hWnd: HWND): HWND; external '[email protected] stdcall';

function MyDirName(S:String): String;
var
  InsPath: String;
  er: boolean;
  myFile:String;
begin
  Result:=ExpandConstant('C:\Games\World_of_Tanks\'); //если ключа нет то будем ставить сюда
  er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath);
  if er and (InsPath<>'') then //если ключ существует и там что-то записано
  begin
    Result := InsPath;
  end;
end;

procedure LogoOnClick(Sender: TObject);
var ResCode: Integer;
begin
  ShellExec('', '{#MyAppURL}', '' , '', SW_SHOW, ewNoWait, ResCode)
end;

procedure RedesignWizardForm;
var
 i: integer;
  BtnPanel: TPanel;
  BtnImage: TBitmapImage;

begin
  ExtractTemporaryFile('logo.bmp')
  BtnPanel:=TPanel.Create(WizardForm)
  with BtnPanel do begin
    Left:=0
    Top:=315
    Width:=179
    Height:=46
    Cursor:=crHand
    OnClick:[email protected]
    Parent:=WizardForm
  end;
  BtnImage:=TBitmapImage.Create(WizardForm)
  with BtnImage do begin
    AutoSize:=True;
    Enabled:=False;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo.bmp')
    Parent:=BtnPanel
  end;

  with WizardForm do
  begin
    Caption := ExpandConstant('{cm:Main}');
  end;

  with WizardForm.WizardBitmapImage do
  begin
    Width := ScaleX(502);
  end;

  with WizardForm.WelcomeLabel2 do
  begin
    Visible := False;
  end;

  with WizardForm.WelcomeLabel1 do
  begin
    Visible := False;
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
    Left := ScaleX(0);
    Width := ScaleX(502);
    Height := ScaleY(70);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
    Visible := False;
  end;

  with WizardForm.PageNameLabel do
  begin
    Visible := False;
  end;

  with WizardForm.WizardBitmapImage2 do
  begin
    Width := ScaleX(502);
  end;

  with WizardForm.FinishedLabel do
  begin
    Visible := False;
  end;

  with WizardForm.FinishedHeadingLabel do
  begin
    Visible := False;
  end;
end;

procedure ShowPicHint(const PicFilePath: String);
var
    pt: TPoint;
begin
    if not GetCursorPos(pt) then Exit;
    InfoPic.Bitmap.LoadFromFile(PicFilePath);
    try
        with PicForm do
        begin
            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
            Show;
        end;
    finally
        SetFocus(WizardForm.Handle);
    end;
end;


procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
var
    UndefPic: String;
begin
    if Index = -1 then Exit;
    if Index = LastIndex then Exit;
    try
        case TNewCheckListBox(Sender).ItemCaption[Index] of
           'Белые сбитые гусеницы': UndefPic := '1.bmp';
            'Белые трупы танов': UndefPic := '2.bmp';
            'Калькулятор WN8 в бою': UndefPic := '3.bmp';
            'Мод достижений в бою': UndefPic := '10.bmp';
            'Процент отметки в бою': UndefPic := '18.bmp';
            'Маркеры с отлетающим уроном': UndefPic := '12.bmp';
            'Калькулятор брони в ангаре': UndefPic := '4.bmp';
            'Просмотр попаданий в ангаре': UndefPic := '13.bmp';
            'Менеджер реплеев': UndefPic := '9.bmp';
            'Процент побед на танках в ангаре': UndefPic := '14.bmp';
        else
            begin
                LastIndex := UNDEF_INDEX;
                PicForm.Hide;
                Exit;
            end;
        end;
        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);
        ShowPicHint(TempPath + UndefPic);
    finally
        LastIndex := Index;
    end;
end;


procedure CompOnMouseLeave(Sender: TObject);
begin
    PicForm.Hide;
    LastIndex := -1;
end;


procedure InitInfo();
begin
    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;
    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;
    TempPath := AddBackslash(ExpandConstant('{tmp}'));
    LastIndex := UNDEF_INDEX;
    PicForm := TForm.Create(WizardForm)
    with PicForm do
    begin
        BorderStyle := bsNone;
        FormStyle := fsStayOnTop;
        InfoPic := TBitmapImage.Create(PicForm)
        with InfoPic do
        begin
            Parent := PicForm;
            AutoSize := True;
        end;
    end;
    SetWindowLong(PicForm.Handle, GWL_EXSTYLE, GetWindowLong(PicForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    SetLayeredWindowAttributes(PicForm.Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
end;

procedure InitializeWizard();
begin
  InitInfo();
  RedesignWizardForm;
end;

 

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...