#1 29-09-2010 00:28

Sergey81
Registered: 19-12-2008
Posts: 654

[SA/VC|REL] Автосейв

Демонстрация - http://www.youtube.com/watch?v=a-fib0ajkao
Автосейв после миссии - сохранение в последний слот.
Автосейв перед миссией - сохранение в предпоследний слот.
Autosave-restart.cs - после провала миссии, по нажатию клавиши F9, будет сохранение(в предпоследний слот) и перезапуск миссии посредством телепорта на маркер миссии.
vcautosave.cs - автосейв в предпоследний слот после миссии для VC.
vcquicksave.cs - По нажатию клавиши "2" - сохранение в третий слот.

Исходники -

Autosave.cs[v7]:

{$CLEO}
var
20@ : Integer
21@ : Integer
end
0000:
   // 0652: 20@ = integer_stat 147
   31@ = 1
0A8D: 25@ = read_memory 0x0061907A size 4 virtual_protect 1
0A8D: 26@ = read_memory 0x0061907E size 1 virtual_protect 1
1@ = 0
0A9F: 0@ = current_thread_pointer
0A8E: 10@ = 0@ + 0x10
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0
0A8F: 11@ = 10@ - @lbl
0A8C: write_memory 0x00469E2C size 4 value 11@ virtual_protect 1
0@ += 0x40 // 0@ = 1@'s global address; fixed 02/10/10
11@ += 2
0A8C: write_memory 11@ size 4 value 0@ virtual_protect 0
while true
    wait 0 
if
 $ONMISSION == 1
 31@ == 1
 then
    wait 0
    0652: 20@ = integer_stat 147
    31@ = 0
end   
    if
        1@ == 1
    then
        while true
            wait 0
            0652: 21@ = integer_stat 147  
            if and
                $ONMISSION == 0
                not Actor.Driving($PLAYER_ACTOR)
                21@ > 20@  
            then
                Break       
            end
        end
0A8C: write_memory 0x0061907A size 4 value 0x90909090 virtual_protect 1
0A8C: write_memory 0x0061907E size 1 value 0x90 virtual_protect 1
      wait 1
           0AA5: call 0x619060 num_params 1 pop 0 7
      wait 2
0A8C: write_memory 0x0061907A size 4 value 25@ virtual_protect 1
0A8C: write_memory 0x0061907E size 1 value 26@ virtual_protect 1  
 31@ = 1        
    //    0ACE: show_formatted_text_box "SAVE OK"
        1@ = 0
    end
end

:lbl
hex
    C705 00000000 01000000  // MOV DWORD PTR DS:[00000000], 1
    B8 9B9A4600             // MOV EAX,00469A9B
    FFE0                    // JMP EAX
end

Autosave_before_mission.cs[v6](могут быть глюки из за использования):

{$CLEO} 
var
20@ : Integer
21@ : Integer
end
    0652: 20@ = integer_stat 146
0A8D: 25@ = read_memory 0x0061907A size 4 virtual_protect 1
0A8D: 26@ = read_memory 0x0061907E size 1 virtual_protect 1
1@ = 0
0A9F: 0@ = current_thread_pointer
0A8E: 10@ = 0@ + 0x10
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0
0A8F: 11@ = 10@ - @lbl
0A8C: write_memory 0x004684BC size 4 value 11@ virtual_protect 1
0@ += 0x40
11@ += 2
0A8C: write_memory 11@ size 4 value 0@ virtual_protect 0
while true
    wait 0
    if
        1@ == 1
    then
       while true
            wait 0
            0652: 21@ = integer_stat 146  
            if and
       //     $ONMISSION == 0
                not Actor.Driving($PLAYER_ACTOR)   
                  21@ == 20@   
            then
                Break
            end
        end
0A8C: write_memory 0x0061907A size 4 value 0x90909090 virtual_protect 1
0A8C: write_memory 0x0061907E size 1 value 0x90 virtual_protect 1
      wait 0               
           0AA5: call 0x619060 num_params 1 pop 0 6
      wait 0
0A8C: write_memory 0x0061907A size 4 value 25@ virtual_protect 1
0A8C: write_memory 0x0061907E size 1 value 26@ virtual_protect 1             
       1@ = 0
    
    end
end

:lbl
hex
    C705 00000000 01000000  // MOV DWORD PTR DS:[00000000], 1
    B8 7B804600             // MOV EAX,  46807B
    FFE0                    // JMP EAX
end

Autosave-restart.cs[v2]:

{$CLEO} 
var
20@ : Integer
21@ : Integer
end
30@ = 1
0A8D: 28@ = read_memory 0x0061907A size 4 virtual_protect 1
0A8D: 29@ = read_memory 0x0061907E size 1 virtual_protect 1
    0652: 20@ = integer_stat 146
1@ = 0
0A9F: 0@ = current_thread_pointer
0A8E: 10@ = 0@ + 0x10
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0
0A8F: 11@ = 10@ - @lbl
0A8C: write_memory 0x004684BC size 4 value 11@ virtual_protect 1
0@ += 0x40
11@ += 2
0A8C: write_memory 11@ size 4 value 0@ virtual_protect 0
while true
    wait 0
    if
        1@ == 1
    then
       while true
            wait 0
            0652: 21@ = integer_stat 146  
            if and
       //     $ONMISSION == 0
                not Actor.Driving($PLAYER_ACTOR)   
                  21@ == 20@   
            then
                Break
        else 
         if and 
         $ONMISSION == 0
         not Actor.Driving($PLAYER_ACTOR)
       0AB0:  key_pressed 120
    then
    00A1: put_actor $PLAYER_ACTOR at 25@ 26@ 27@
0A8C: write_memory 0x0061907A size 4 value 0x90909090 virtual_protect 1
0A8C: write_memory 0x0061907E size 1 value 0x90 virtual_protect 1
      wait 0
           0AA5: call 0x619060 num_params 1 pop 0 6
      wait 0
0A8C: write_memory 0x0061907A size 4 value 28@ virtual_protect 1
0A8C: write_memory 0x0061907E size 1 value 29@ virtual_protect 1
    end

            end
        end
00A0: store_actor $PLAYER_ACTOR position_to 25@ 26@ 27@               
       1@ = 0
    end
end

:lbl
hex
    C705 00000000 01000000  // MOV DWORD PTR DS:[00000000], 1
    B8 7B804600             // MOV EAX,  46807B
    FFE0                    // JMP EAX
end

Quicksave (VC) [v1]

{$CLEO .cs}
0000: NOP 
while true
wait 0 
if and
   $ONMISSION == 0 
   not Actor.Driving($PLAYER_ACTOR)
05EE:  key_pressed 50 //115 
then
wait 0
05E1: call 0x61D8B0 num_params 1 pop 0 2
wait 500
end
end

Autosave (VC) [v1]

{$CLEO}
11@ = 0
05F7: 0@ = label @lbl offset
05DF: write_memory 0x00689A5C size 4 value 0@ virtual_protect 1 //689A5C
05F8: 1@ = var 11@ offset
0@ += 2
05DF: write_memory 0@ size 4 value 1@ virtual_protect 0
while true
    wait 0
    if
        11@ == 1
    then
        while true
            wait 0
            if and
                $ONMISSION == 0
                not Actor.Driving($PLAYER_ACTOR)    
            then
                Break
            end
        end
        05E1: call 0x61D8B0 num_params 1 pop 0 6        
        11@ = 0
    end
end

:lbl
hex
    C705 00000000 01000000  // MOV DWORD PTR DS:[00000000], 1
    B8 C56B4500             // MOV EAX,00456BC5
    FFE0                    // JMP EAX
end

Зеркало на GTAGarage.

Last edited by Sergey81 (21-12-2010 15:38)

Offline

#2 29-09-2010 00:32

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA/VC|REL] Автосейв

Хех, а я только тему новую создал))
http://sannybuilder.com/forums/viewtopi … 532#p12532

while true
    wait 0
    if
        $ONMISSION == 1
    then
0A92: create_custom_thread "AutoSaves.s"   
    end
end

так, а теперь давай прикинем, сколько тысяч скриптов будет создано после запуска первой же миссии? С виду то может все и работает, но это некрасивый способ - бесконечно создавать новый скрипт и сразу же его прекращать. Утечки памяти и все-такое.

Мне кажется ты чуть-чуть поторопился с релизом). Почитай мое последнее сообщение в той теме.

Last edited by Seemann (29-09-2010 00:36)

Offline

#3 29-09-2010 04:56

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Seemann wrote:

Хех, а я только тему новую создал))
http://sannybuilder.com/forums/viewtopi … 532#p12532

while true
    wait 0
    if
        $ONMISSION == 1
    then
0A92: create_custom_thread "AutoSaves.s"   
    end
end

так, а теперь давай прикинем, сколько тысяч скриптов будет создано после запуска первой же миссии? С виду то может все и работает, но это некрасивый способ - бесконечно создавать новый скрипт и сразу же его прекращать. Утечки памяти и все-такое.

Мне кажется ты чуть-чуть поторопился с релизом). Почитай мое последнее сообщение в той теме.

Да я знаю, это так, демо версия. С hex..end раньше не работал, так что будут вопросы.

Offline

#4 29-09-2010 11:46

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: [SA/VC|REL] Автосейв

@Sergey81 - я заметил что у тебя выработалась тенденция следующего характера - нашёл адрес - сделал скрипт. Изучи ВСЕ полезные/бесполезные адреса и ф-ции, и сделай мультимод (как в своё время, это сделал капюшон).

Offline

#5 29-09-2010 12:24

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Sw[ee]t wrote:

@Sergey81 - я заметил что у тебя выработалась тенденция следующего характера - нашёл адрес - сделал скрипт. Изучи ВСЕ полезные/бесполезные адреса и ф-ции, и сделай мультимод (как в своё время, это сделал капюшон).

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

Offline

#6 02-10-2010 10:40

Kostyan
Registered: 27-09-2009
Posts: 94

Re: [SA/VC|REL] Автосейв

Sw[ee]t wrote:

@Sergey81 - я заметил что у тебя выработалась тенденция следующего характера - нашёл адрес - сделал скрипт. Изучи ВСЕ полезные/бесполезные адреса и ф-ции, и сделай мультимод (как в своё время, это сделал капюшон).

Причём тут Капюшон, в его модах я не нашёл не одного примера работы с памятью, всё через опкоды, единственное проверки на нажатие клавишь wink

Offline

#7 02-10-2010 16:12

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: [SA/VC|REL] Автосейв

@Kostyan - а при чём тут память? В далёкие времена, на сколько я помню, он в своём мультимоде объединил все наработки в области скриптинга (жалко я к sb подключился только в 2008-м smile)

Offline

#8 02-10-2010 16:33

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

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

Last edited by Sergey81 (02-10-2010 16:36)

Offline

#9 02-10-2010 23:17

Kostyan
Registered: 27-09-2009
Posts: 94

Re: [SA/VC|REL] Автосейв

Sergey81 wrote:

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

Согласен, после создания библиотеки клео, мультимоды отошли на задний план

Offline

#10 08-10-2010 15:47

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Обновил первый пост, добавил сейв перед миссией(тестим на свой страх и риск, возможно будет сохранять ещё где-то, незнаю). Как сделать быструю загрузку так и не разобрался, судя по всему там функция не такая простая как сохранение.
ЗЫ. При провале миссии игра не сохраняется.

Last edited by Sergey81 (08-10-2010 15:49)

Offline

#11 09-10-2010 21:21

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Версия №6, исправления Autosave_before_mission.cs, а именно $ONMISSION == 0, там вобще стояло присваивание, из за чего возникал серьёзный баг, с проверкой не работает, а вобще без неё вроде всё нормально, проверил на нескольких миссиях. Сейвы кстати могут портиться при использовании предыдущих версий, так что лучше обновиться. Поэтому для тестирования я скачал новый отсюда - http://www.gtasavegames.com/savegames/San_Andreas

Last edited by Sergey81 (09-10-2010 21:23)

Offline

#12 10-10-2010 04:29

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA/VC|REL] Автосейв

с проверкой не работает

потому что после 0417 в оригинальном main.scm сразу стоит $ONMISSION = 1. Вообще есть вероятность, что сохранение происходит при активной миссии, значит возможны глюки.

Offline

#13 10-10-2010 12:02

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Seemann wrote:

с проверкой не работает

потому что после 0417 в оригинальном main.scm сразу стоит $ONMISSION = 1. Вообще есть вероятность, что сохранение происходит при активной миссии, значит возможны глюки.

Хм, так разве сохранение во время миссии не приводит к невозможности загрузить этот сейв? Почему тогда в данном случае сейв загружается?
UPD.Не заметил что речь про 0417. Щас то я 00BA использую.
Для себя кстати заметил что сейв перед миссией более полезная штука чем после.

Last edited by Sergey81 (10-10-2010 12:04)

Offline

#14 21-10-2010 17:44

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Обновил Autosave.cs, теперь сохраняет строго после успешного выполнения миссии, судя по тому, что я натестил=) Версия 7, наверно, уже финальная будет.

Offline

#15 11-12-2010 18:38

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Выложил в первом посте квиксейв для Vice City. Сейвится по кнопке 2, на f5 почему то не получается поставить, код не срабатывает. Также, полученный сейв не грузится, пока не перезайти в игру. Т.е. если засейвились, потом загрузили этот сейв - вылет. Незнаю почему.

Offline

#16 11-12-2010 23:22

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA/VC|REL] Автосейв

Возможно .b файл не закрывается и при обращении к нему - вылет

Offline

#17 12-12-2010 00:01

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Seemann wrote:

Возможно .b файл не закрывается и при обращении к нему - вылет

Я проверил ещё раз, там после вызова этой функции не грузятся даже другие сейвы.

Offline

#18 13-12-2010 00:26

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Следом за квиксейвом, автосейв для Vice City(см. 1 пост).
В отличие от SA-версии, используется опкод 0318: set_latest_mission_passed 'BANK_1'
Пока не особо оттестировано.
Демонстрация - http://www.youtube.com/watch?v=VxMa-W9mLE8
ЗЫ. Здесь, опять же, после сохранения сейвы загружаются только после перезапуска.
ЗЫ2. Обновил аттач, теперь в нём скрипты квиксейва и автосейва для SA и VC.
ЗЫ3. Темку, если возможно, переименуйте в [SA/VC|REL] Автосейв

Last edited by Sergey81 (13-12-2010 03:28)

Offline

#19 13-12-2010 23:29

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: [SA/VC|REL] Автосейв

Не совсем понял механику скрипта по видео. В начале в меню LOAD ты выбираешь в какой слот будет автосохранение? Это нужно делать перед каждой миссией?

Offline

#20 14-12-2010 00:18

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Seemann wrote:

Не совсем понял механику скрипта по видео. В начале в меню LOAD ты выбираешь в какой слот будет автосохранение? Это нужно делать перед каждой миссией?

Не, это я просто показал что перед миссией в этом слоте сохранения не было.
По функционалу скрипт такой же, что и в SA.

Offline

#21 04-02-2011 21:07

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

Квиксейв для gta3, управление такое же как и в VC, нажимаем кнопку 2, игра сохраняется в первый слот.

Offline

#22 23-04-2011 07:27

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: [SA/VC|REL] Автосейв

Я немного переписал код для определения, был ли использован опкод (в этом случае - опкод 0391). Правилен ли он?

{$CLEO .cs}

0A8C: write_memory 0x4841BB size 1 value 0xE9 virtual_protect true // jmp
0AC6: 0@ = label @label offset
dec(0@, 0x4841C0) // offset
0A8C: write_memory 0x4841BC size 4 value 0@ virtual_protect true // offset 
0AC6: 0@ = label @label offset
0AC6: 1@ = label @value offset
inc(0@, 2)
0A8C: write_memory 0@ size 4 value 1@ virtual_protect false // offset

while true
    0A8D: 0@ = read_memory 1@ size 4 virtual_protect false
    if
        0@ == 1
    then
        if
            88FE: not text_box_displayed
        then
            0ACE: show_formatted_text_box "%.4X was used" 0x0391
            // then, we need to reload txd dictionaries
        end
    end
    003D:
end

:label
hex
    C705 00000000 01000000 // mow dword ptr ds:[00000000], 1
    B8 405A4600            // mov eax, 465A40h
    FFD0                   // call eax
    B8 C0414800            // mov eax, 4841C0h
    FFE0                   // jmp eax
end

:value
hex
    00000000
end

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


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#23 24-06-2011 17:50

444andrei444
Registered: 29-03-2011
Posts: 317
Website

Re: [SA/VC|REL] Автосейв

А зачем убирать лишнее можно ведь просто не пользоваться. У меня например почти все активируется из меню длится не долго потом отключается. Кстати у меня при старте игры записываются в память стандартные значения некоторых адресов памяти проблема в том что активируя какую нибудь возможность из памяти и не дождавшись пока значение запишется на стандартное начать новую игру, то значение не вернется на стандартное.

Offline

#24 02-08-2012 11:21

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [SA/VC|REL] Автосейв

http://youtu.be/Vh26B1d85WM
Собственно, поиграв в GTA 3 на ios, решил доделать фичу рестарта миссии. Код внедрен в скрипт автосейва, так что тут два в одном.

Обновлено 10,09,2012:

{$CLEO}
var
20@ : Integer
21@ : Integer
end
0000:
wait 500
   // 0652: 20@ = integer_stat 147
   31@ = 1
0A8D: 25@ = read_memory 0x618FA0 size 4 virtual_protect 1 
0A8D: 26@ = read_memory 0x618FA4 size 1 virtual_protect 1
1@ = 0
0A9F: 0@ = current_thread_pointer
0A8E: 10@ = 0@ + 0x10
0A8D: 10@ = read_memory 10@ size 4 virtual_protect 0
0A8F: 11@ = 10@ - @lbl
0A8C: write_memory 0x00469E2C size 4 value 11@ virtual_protect 1
0@ += 0x40 // 0@ = 1@'s global address; fixed 02/10/10
11@ += 2
0A8C: write_memory 11@ size 4 value 0@ virtual_protect 0

while true
    wait 0
if and
 $ONMISSION == 1
 016B:   fading 
 06B9:   cutscene_data_loaded 
 31@ == 1
 then
0AB1: call_scm_func @__LabelToOffset 1 label @label store_to 15@
0AB1: call_scm_func @__LabelToOffset 1 label @money store_to 16@
0AB1: call_scm_func @__LabelToOffset 1 label @armour store_to 17@
0AB1: call_scm_func @__LabelToOffset 1 label @health store_to 18@
0AB1: call_scm_func @__LabelToOffset 1 label @playerpos store_to 19@
0AB1: call_scm_func @__getwpns 1 15@
0AB1: call_scm_func @__getmoneyarmourhealth 3 16@ 17@ 18@
0AB1: call_scm_func @__getplayerpos 1 19@
    0652: 20@ = integer_stat 147
    31@ = 0
end   
    if
        1@ == 1
    then
        while true
            wait 0
            0652: 21@ = integer_stat 147  
            if and
                $ONMISSION == 0
                not Actor.Driving($PLAYER_ACTOR)
                21@ > 20@  
            then
                Break
            else

0A8D: 29@ = read_memory 0xBAACC0 size 2 virtual_protect 0
if and
                //076F:   text_priority_displayed
                29@ == 0x727E
                $ONMISSION == 0
                21@ == 20@
then
            wait 500
0A0E: disable_text_with_style 1
03F0: enable_text_draw 1 
00BC: show_text_highpriority GXT '_RESTAR' time 1000 flag 1  
0A8C: write_memory 0x53BF8A size 2 value 0x9090 virtual_protect 1  
0A8C: write_memory 0x53BF96 size 4 value 0x90909090 virtual_protect 1  
0A8C: write_memory 0x53BF9A size 2 value 0x9090 virtual_protect 1  
0A8C: write_memory 0x58FCC2 size 4 value 0x90909090 virtual_protect 1  
0A8C: write_memory 0x58D4BE size 4 value 0x90909090 virtual_protect 1  
0A8C: write_memory 0x58D4C2 size 4 value 0x90909090 virtual_protect 1  
0A8C: write_memory 0xB7CB49 size 1 value 1 virtual_protect 0      

while true
wait 0
if
00E1:   player 0 pressed_key 10 //N 
then
0A8C: write_memory 0xB7CB49 size 1 value 0 virtual_protect 0  // Unfreeze
0A8C: write_memory 0x53BF8A size 2 value 0xC084 virtual_protect 1  // Disable frozen game stuff
0A8C: write_memory 0x53BF96 size 4 value 0x0298850F virtual_protect 1  // Disable frozen game stuff
0A8C: write_memory 0x53BF9A size 2 value 0x0 virtual_protect 1  // Disable frozen game stuff
0A8C: write_memory 0x58FCC2 size 4 value 0x4D75C084 virtual_protect 1  // Disable frozen game text draw
0A8C: write_memory 0x58D4BE size 4 value 0x850FC084 virtual_protect 1  // Disable frozen game texture draw
0A8C: write_memory 0x58D4C2 size 4 value 0x000000AF virtual_protect 1  // Disable frozen game texture draw    
        for 22@ = 1 to 35 step 1
        0A8C: write_memory 15@ size 4 value 0x00 virtual_protect 1
        15@ += 4
        end
break
end

if
00E1:   player 0 pressed_key 11 //Y 
then
048F: actor $PLAYER_ACTOR remove_weapons
0A8C: write_memory 0xB7CB49 size 1 value 0 virtual_protect 0  // Unfreeze
0A8C: write_memory 0x53BF8A size 2 value 0xC084 virtual_protect 1  // Disable frozen game stuff
0A8C: write_memory 0x53BF96 size 4 value 0x0298850F virtual_protect 1  // Disable frozen game stuff
0A8C: write_memory 0x53BF9A size 2 value 0x0 virtual_protect 1  // Disable frozen game stuff
0A8C: write_memory 0x58FCC2 size 4 value 0x4D75C084 virtual_protect 1  // Disable frozen game text draw
0A8C: write_memory 0x58D4BE size 4 value 0x850FC084 virtual_protect 1  // Disable frozen game texture draw
0A8C: write_memory 0x58D4C2 size 4 value 0x000000AF virtual_protect 1  // Disable frozen game texture draw  

while true 
wait 0
if and
03EE:   player $PLAYER_CHAR controllable
816B:   not fading  
then
Break
end
end
   
0AB1: call_scm_func @__LabelToOffset 1 label @label store_to 15@
0AB1: call_scm_func @__LabelToOffset 1 label @money store_to 16@
0AB1: call_scm_func @__LabelToOffset 1 label @armour store_to 17@
0AB1: call_scm_func @__LabelToOffset 1 label @health store_to 18@
0AB1: call_scm_func @__LabelToOffset 1 label @playerpos store_to 19@
0AB1: call_scm_func @__givewpns 1 15@
0AB1: call_scm_func @__givemoneyarmourhealth 3 16@ 17@ 18@
        for 22@ = 1 to 35 step 1
        0A8C: write_memory 15@ size 4 value 0x00 virtual_protect 1
        15@ += 4
        end
0AB1: call_scm_func @__putplayeratpos 1 19@ 
break
end
end
end    //end else
jump @here  
            end
        end  
0A8C: write_memory 0x618FA0 size 4 value 0x90909090 virtual_protect 1 
0A8C: write_memory 0x618FA4 size 1 value 0x90 virtual_protect 1   
wait 1       
0AA5: call 0x619060 num_params 1 pop 0 7 
wait 2 
0A8C: write_memory 0x618FA0 size 4 value 25@ virtual_protect 1 
0A8C: write_memory 0x618FA4 size 1 value 26@ virtual_protect 1  
:here
 31@ = 1        
    //    0ACE: show_formatted_text_box "SAVE OK"
        1@ = 0
    end
end

:lbl
hex
    C705 00000000 01000000  // MOV DWORD PTR DS:[00000000], 1
    B8 9B9A4600             // MOV EAX,00469A9B
    FFE0                    // JMP EAX
end

:label
hex
00 00 00 00   //slot 
00 00 00 00   //ammo for that weapon
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
end

:money
hex
00 00 00 00
end
:health
hex
00 00 00 00
end
:armour
hex
00 00 00 00
end
:playerpos
hex
00 00 00 00
00 00 00 00
00 00 00 00
end


:__LabelToOffset //0AB1: call_scm_func @__LabelToOffset 1 label @qqq4 store_to 15@
if
    0@ == 0
then
    0AB2: ret 1 0
end     
0A9F: 1@ = current_thread_pointer
1@ += 0x10 
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // baseIP
0062: 1@ -= 0@ // label address
0AB2: ret 1 1@

:__getwpns
0085: 14@ = 0@
    0A96: 15@ = actor $PLAYER_ACTOR struct
    15@ += 0x5A0
        for 13@ = 1 to 13 step 1  
        0A8D: 21@ = read_memory 15@ size 4 virtual_protect 1 //slot x
        15@ += 0xC                               
        0A8D: 1@ = read_memory 15@ size 4 virtual_protect 1 //ammo for that weapon
        15@ += -0xC
        0A8C: write_memory 14@ size 4 value 21@ virtual_protect 1  //write slot x
        14@ += 4
        0A8C: write_memory 14@ size 4 value 1@ virtual_protect 1  //write ammo
        14@ += 4
        15@ += 0x1C
        end 
0AB2: ret 0

:__givewpns
0085: 14@ = 0@
        for 12@ = 1 to 13 step 1
        0A8D: 3@ = read_memory 14@ size 4 virtual_protect 1  // weapon id
        14@ += 0x4
        0A8D: 4@ = read_memory 14@ size 4 virtual_protect 1  //ammo
        14@ += -0x4
                  if
                  3@ <> 0
                  then
                  0AA7: call_function 0x454AC0 num_params 1 pop 1 3@ 5@    //weapon id to model id
                  0247: request_model 5@
                  038B: load_requested_models
                  while 8248: not  model 5@ available 
                  wait 0
                  end
                  01B2: give_player $PLAYER_ACTOR weapon 3@ ammo 4@ // Load the weapon model before using this
                  0249: release_model 5@ 
                  6@ = 1
                  end
        14@ += 0x8
        end
0AB2: ret 0

:__getmoneyarmourhealth
//offsets 0@ - money 1@ - armour 2@ - health
0A8D: 9@ = read_memory 0xB7CE50 size 4 virtual_protect 0
0A8C: write_memory 0@ size 4 value 9@ virtual_protect 0

0A8D: 10@ = read_memory 0xB6F5F0 size 4 virtual_protect 0
10@ += 0x548
0A8D: 11@ = read_memory 10@ size 4 virtual_protect 0 
0A8C: write_memory 1@ size 4 value 11@ virtual_protect 0
10@ += -0x8 
0A8D: 12@ = read_memory 10@ size 4 virtual_protect 0
0A8C: write_memory 2@ size 4 value 12@ virtual_protect 0
0AB2: ret 0

:__givemoneyarmourhealth
//0@ - money 1@ - armour 2@ - health
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
0A8D: 2@ = read_memory 2@ size 4 virtual_protect 0
0A8C: write_memory 0xB7CE50 size 4 value 0@ virtual_protect 0
0A8D: 10@ = read_memory 0xB6F5F0 size 4 virtual_protect 0
10@ += 0x548
0A8C: write_memory 10@ size 4 value 1@ virtual_protect 1
10@ += -0x8 
0A8C: write_memory 10@ size 4 value 2@ virtual_protect 0
0AB2: ret 0

:__getplayerpos
00A0: store_actor $PLAYER_ACTOR position_to 1@ 2@ 3@
0A8C: write_memory 0@ size 4 value 1@ virtual_protect 0 
0@ += 0x4
0A8C: write_memory 0@ size 4 value 2@ virtual_protect 0
0@ += 0x4
0A8C: write_memory 0@ size 4 value 3@ virtual_protect 0
0AB2: ret 0

:__putplayeratpos
0A8D: 1@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x4
0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0
0@ += 0x4
0A8D: 3@ = read_memory 0@ size 4 virtual_protect 0
if
80DF:  not actor $PLAYER_ACTOR driving 
then
select_interior 0
04FA: reset_interior 0 colors
057E: set_radar_grey 0
0860: link_actor $PLAYER_ACTOR to_interior 0
Actor.PutAt($PLAYER_ACTOR, 1@, 2@, 3@)
else
0362: remove_actor $PLAYER_ACTOR from_car_and_place_at 1@ 2@ 3@
end
0AB2: ret 0

http://www.gtagarage.com/mods/show.php?id=14143

Last edited by Sergey81 (10-09-2012 11:34)

Offline

#25 02-08-2012 12:35

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: [SA/VC|REL] Автосейв

Такой метод получения адреса метки не работает в GTA3. (Выходит, что ты записываешь данные куда-то, и читаешь оттуда же, так что кажется, что всё работает правильно).


Не заметил, что это СА.

Last edited by DK22Pac (02-08-2012 12:36)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

Board footer

Powered by FluxBB