#1 24-08-2010 15:29

Sergey81
Registered: 19-12-2008
Posts: 654

[REL] Перезарядка

Как то гуглил, не нашёл ничего подходящего. Потом правда нашёл один скрипт, но он позволял перезаряжаться только либо стоя, либо сидя, если например прицелишься, перезарядится нельзя.
Ещё позже посмотрел как этот скрипт работает, а там оказалось куча глобальных переменных(мб из за него у меня и были глюки с миссиями).
Вобщем, мой скрипт позволяет перезаряжаться в любое время, будь то прицелившись, во время ходьбы/бега и т.д.
Видео-демонстрация - http://www.youtube.com/watch?v=FduiJBxyV1o   
Благодарности юзерам Gtaforums за адреса.

Update от 22.02.2011:
1)Код для SA:

{$CLEO .cs}
0000: NOP 
thread 'RELOAD' 

:RELOAD_13
wait 100 
if 
   Player.Defined($PLAYER_CHAR)
jf @RELOAD_13 
0A96: 0@ = actor $PLAYER_ACTOR struct 
0@ += 1816 
0A8D: 1@ = read_memory 0@ size 1 virtual_protect 0 
0A96: 0@ = actor $PLAYER_ACTOR struct 
0@ += 1440 
1@ *= 28 
005A: 0@ += 1@ // (int) 
0@ += 4 
if 
0AB0:   key_pressed 82 
jf @RELOAD_13 
0A8C: write_memory 0@ size 4 value 2 virtual_protect 1 
jump @RELOAD_13

2)Код для VC:

{$CLEO .cs}
0000: NOP 
thread 'RELOAD' 

:RELOAD_13
wait 100 
if 
   Player.Defined($PLAYER_CHAR)
jf @RELOAD_13 
05E6: 0@ = actor $PLAYER_ACTOR struct
0@ += 1284  
05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 
05E6: 0@ = actor $PLAYER_ACTOR struct
0@ += 1032
1@ *= 24 
//005A: 0@ += 1@ // (int) 
000A: 0@ += 1@ // integer values 
0@ += 4 
if 
05EE:  key_pressed 82 //115
jf @RELOAD_13  
05DF: write_memory 0@ size 4 value 2 virtual_protect 1
jump @RELOAD_13

1)Код для III:

{$CLEO .cs}
0000: NOP 
thread 'RELOAD' 

while true
wait 0
for 0@ = 2 to 11 step 1
if and 
05EE:  key_pressed 82 
02D8:   actor $PLAYER_ACTOR current_weapon == 0@
then
05E6: 1@ = actor $PLAYER_ACTOR struct
1@ += 0x360
0010: 0@ *= 0x18 // integer values
0058: 1@ += 0@ // integer values
05DF: write_memory 1@ size 4 value 2 virtual_protect 1

end

end


end

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

Зеркало на GTAGarage.

Last edited by Sergey81 (22-02-2011 20:56)

Offline

#2 25-08-2010 16:58

El Sanchez
From: Пермь
Registered: 25-08-2010
Posts: 20

Re: [REL] Перезарядка

Спасибо! Всё работает прекрасно! Тоже искал такой скрипт - нашёл, но оказалось, что он далековат от того, чего хотелось бы.

Offline

#3 26-08-2010 13:18

BullDogHEMI427
From: Рязань
Registered: 02-04-2009
Posts: 54

Re: [REL] Перезарядка

Давно хотел такое, но мне как-то хватало и старой перезарядки...
Отличный скрипт. Работает стабильно, без глюков (хотя по идее, если адреса верны - чему там глючить?)


Also known as HemiG
It's cool to Hate. It's cool to be a bloody guitarist.
284487-39e63-35897154-h200.jpg

Offline

#4 26-08-2010 14:51

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

Re: [REL] Перезарядка

Сто лет не играл в СА. Разве там не было автоматической перезарядки? Что именно меняет скрипт?

Offline

#5 26-08-2010 15:24

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

Re: [REL] Перезарядка

Seemann wrote:

Сто лет не играл в СА. Разве там не было автоматической перезарядки? Что именно меняет скрипт?

Ну как же так...
Скрипт даёт возможность по нажатию R перезарядить оружие (а не ждать, пока закончатся патроны в обойме).

Offline

#6 26-08-2010 18:25

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

Есть ещё вариант сделать, чтоб неотстрелянные патроны пропадали, на манер мафии 1.

// This file was decompiled using sascm.ini published by Seemann (http://sannybuilder.com/files/SASCM.rar) on 13.10.2007

{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP 
thread 'RELOAD' 

:RELOAD_13
wait 100 
if 
   Player.Defined($PLAYER_CHAR)
jf @RELOAD_13 
0A96: 0@ = actor $PLAYER_ACTOR struct 
0@ += 1816 
0A8D: 1@ = read_memory 0@ size 1 virtual_protect 0 
0A96: 0@ = actor $PLAYER_ACTOR struct 
0@ += 1440 
1@ *= 28 
005A: 0@ += 1@ // (int) 
0@ += 8
0A8D: 3@ = read_memory 0@ size 1 virtual_protect 0  //ammo clip
0@ += 4
0A8D: 4@ = read_memory 0@ size 1 virtual_protect 0  //total ammo

0470: 8@ = actor $PLAYER_ACTOR current_weapon 
041A: 9@ = actor $PLAYER_ACTOR weapon 8@ ammo
if and
001D:   9@ > 3@ // (int) 
0AB0:   key_pressed 82 
jf @RELOAD_13
0@ -= 8
0A8C: write_memory 0@ size 4 value 2 virtual_protect 1 
0A8D: 6@ = read_memory 0@ size 1 virtual_protect 0  //ammo clip
if
0006: 6@ = 2

0@ += 8
0062: 4@ -= 3@ // (int) 
0A8C: write_memory 0@ size 4 value 4@ virtual_protect 1

jump @RELOAD_14 

:RELOAD_14
wait 1000
jump @RELOAD_13

Есть какие-нибудь предложения по совершенствованию скрипта?

Last edited by Sergey81 (26-08-2010 18:31)

Offline

#7 31-08-2010 09:14

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

Re: [REL] Перезарядка

Проще (и быстрее) перезарядить, чем сменять оружие.

Offline

#8 13-09-2010 20:38

BullDogHEMI427
From: Рязань
Registered: 02-04-2009
Posts: 54

Re: [REL] Перезарядка

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

Last edited by BullDogHEMI427 (13-09-2010 20:38)


Also known as HemiG
It's cool to Hate. It's cool to be a bloody guitarist.
284487-39e63-35897154-h200.jpg

Offline

#9 04-10-2010 09:21

El Sanchez
From: Пермь
Registered: 25-08-2010
Posts: 20

Re: [REL] Перезарядка

Да, с запоминанием патронов это идея. Ведь есть опкод 041A...

Offline

#10 04-10-2010 19:22

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

El Sanchez wrote:

Да, с запоминанием патронов это идея. Ведь есть опкод 041A...

Там же помоему общее ammo, ammo_in_clip только через память.
Да и как это дело запоминать и восстанавливать всё время...

И насчёт

Проще (и быстрее) перезарядить, чем сменять оружие.

не согласен, во время прицеливания/бега так не сделаешь, при езде в машине, в туррет режиме тоже никак. А в машине(driveby.cs) к тому же быстрее перезарядиться через R, чем отстреляв всю обойму.

Кстати, в вышеупомянутом driveby.cs в машине при скроллинге оружия патроны не сбрасываются у оружия(кроме полуавтоматов). Может можно по аналогии сделать так и on_foot, но кода я не видел так что не буду утверждать.

Last edited by Sergey81 (04-10-2010 19:24)

Offline

#11 13-12-2010 03:53

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

Апдейт, в первом посте я выложил код для SA, а также для Vice City. + прикрепил аттач с готовыми скриптами.

Offline

#12 21-02-2011 20:36

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

Наконец то дошли руки сделать перезарядку для GTA3:

{$CLEO .cs}
0000: NOP 
thread 'RELOAD' 

while true
wait 0
for 0@ = 2 to 11 step 1
if and 
05EE:  key_pressed 82 
02D8:   actor $PLAYER_ACTOR current_weapon == 0@
then
05E6: 1@ = actor $PLAYER_ACTOR struct
1@ += 0x360
0010: 0@ *= 0x18 // integer values
0058: 1@ += 0@ // integer values
05DF: write_memory 1@ size 4 value 2 virtual_protect 1

end

end


end

Формулу не стал выводить, как в VC и SA, ибо незачем:D
Архив залил на gtagarage.
В игре перезарядка происходит без анимации, как и в VC, если зажать кнопки огонь и R, будет перезарядка с анимацией.

Last edited by Sergey81 (21-02-2011 20:40)

Offline

#13 21-02-2011 22:47

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

Re: [REL] Перезарядка

Не хватает только проверки player.Defined(0).
И ещё, лучше подождать, пока клавишу не отпустили.


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

Offline

#14 22-02-2011 07:50

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

@DK22Pac - всегда было интересно, в каких случаях игра вылетит без неё? Просто никогда не сталкивался, да и не использую.

Offline

#15 22-02-2011 20:29

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: [REL] Перезарядка

Я думаю надо переименовать тему в [REL|SA|VC|3]. Админы пожалуйста прошу. А Sergey81 можешь в первый пост сразу три скрипта для трех игр?=)


I know everything and nothing...

Offline

#16 22-02-2011 20:40

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

@mfisto - Ок, сейчас сделаю.

Offline

#17 24-03-2011 22:12

Sergey81
Registered: 19-12-2008
Posts: 654

Re: [REL] Перезарядка

Перезарядка с анимацией для VC, немножко криво, но работает smile

{$CLEO .cs}
0000: NOP 
thread 'RELOAD' 
10@ = 17
10@ *= 2
10@ += 0x7DBCB0

while true
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
then
05E6: 0@ = actor $PLAYER_ACTOR struct
0@ += 1284  
05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 
05E6: 0@ = actor $PLAYER_ACTOR struct
0@ += 1032
1@ *= 24 
000A: 0@ += 1@ // integer values 
0@ += 4 

if
05EE:  key_pressed 82 
then
05DF: write_memory 10@ size 2 value 0xFF virtual_protect 0
3@ = 40
end  

if
3@ >= 1
then
05DF: write_memory 0@ size 4 value 2 virtual_protect 1
3@ -= 1
end



end


end

Offline

#18 27-06-2011 13:04

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: [REL] Перезарядка

Не че не криво, все можно сделать...

Offline

Board footer

Powered by FluxBB