#1 04-02-2009 19:44

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Нажатие клавиш

Подскажите как реализовать последовательность нажатия подряд комбинации клавиш, как например когда вводишь читы? Я видел нечто подобное в скриптах Portal gun и Black Phoenix, там это реализованно буквально 5-6-ю опкодами, а мне приходится делать 750(образно) проверок и создавать кучу лэйблов. И то не всегда работает.


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#2 05-02-2009 18:31

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

Если вопрос не совсем понятен то вот пример:

03A4: name_thread 'PORTAL' 

:PORTAL_11
0001: wait 0 ms 
0006: 30@ = -229907 
008B: 30@ = &0(30@,1i) // (int) 
0085: 31@ = 30@ // (int) 
0016: 31@ /= 65536 
0012: 31@ *= 65536 
0062: 30@ -= 31@ // (int) 
00D6: if 
0039:   30@ == 20559 
004D: jump_if_false @PORTAL_11 
0006: 30@ = -229908 
00D6: if 
0038:   &0(30@,1i) == 1381253452 
004D: jump_if_false @PORTAL_11 
0004: &0(30@,1i) = 1381253376 
03E5: show_text_box 'CHEAT1'  // Cheat activated
0006: 9@ = 0 
0247: load_model #TEC9 
038B: load_requested_models

Когда в игре введешь Portal то мод активируется. Как это сделать?


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#3 06-02-2009 13:44

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Нажатие клавиш

Где-то в папке СБ есть файл memoryhandling.txt, в нём есть как делать читы с разным количеством символов...пользуйся=)


GIMS developer

Offline

#4 12-02-2009 16:24

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

И еще про клавиши. Есть ли такой опкод который как бы "физически" нажимал нужную кнопку? ну например 

 :thread
wait 0
if
00EC:   actor $PLAYER_ACTOR 0 near_point $x $y radius 80.0 80.0 
jf @thread
wait 100
????: press key 0x13
end_thread

Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#5 12-02-2009 22:25

XotaBi4b
From: Харьков
Registered: 13-09-2008
Posts: 87

Re: Нажатие клавиш

1) Не вижу смысла в опкоде, который как бы "физически" "нажимал" нужную кнопку.

00EC:   actor $PLAYER_ACTOR 0 near_point $x $y radius 80.0 80.0 Если игрок, находится в этом квадрате, то не нужно, виртально нажимать клавишу с помощью опкода, и в это же время, проверять, не нажата ли клавиша, виртуальным опкодом. Это Г.Л.У.П.О.. Надо делать какое либо действие.

2) После :thread надо хотябы wait 500 , иначе, если игрок не будет находится в указаном квадрате -  то игра зависнет.

Offline

#6 13-02-2009 06:44

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

Re: Нажатие клавиш

Касательно темы нажатия клвиш.

В файле memoryhandling.txt нет примера на @s или s$ переменных, может кто то знает по какому адресу прочитать такой набор клавиш. Т.е чтоб было не 16 последних символов а 8. И такой вопрос если нажать enter или там shift, то какой символ будет отображаться?


I know everything and nothing...

Offline

#7 13-02-2009 12:37

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

XotaBi4b я Н.Е. С.П.Р.А.Ш.И.В.А.Ю. глупо это или нет! Я спосил: возможно ли такое? И насчет 00EC:   actor $PLAYER_ACTOR 0 near_point $x $y radius 80.0 80.0- я взял этот опкод ПРОСТО ТАК! ОТ НЕГО НИЧЕГО НЕ ЗАВИСИТ! Так же как и WAIT- если поставить 0 игра не зависнет: перед if нужно поставить WAIT, не спорю, но чему оно равно не имеет значения. Попробуй.

P.S.: и в моём скрипте нет поверки нажатия клавиши.

Last edited by Gyr (13-02-2009 12:38)


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#8 13-02-2009 14:24

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

Re: Нажатие клавиш

mfisto,

И такой вопрос если нажать enter или там shift, то какой символ будет отображаться?

ничего, учитываются только буквы и цифры

Gyr,

возможно ли такое?

зависит от того, для чего тебе нужно. Отдельного опкода нет. Но теоретически можно записать по определенному адресу нужное число, и игра будет считать, что была нажата клавиша.

Offline

#9 13-02-2009 19:04

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

Seemann не подскажешь как?


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#10 13-02-2009 19:42

Alien
Registered: 12-10-2008
Posts: 564

Re: Нажатие клавиш

может сюда записывать надо?

 0@ = -229908
 008B: 1@ = &0(0@,1i)
div(1@,0x100)
mul(1@,0x100)
1@ += 0x41 //virtual key code нужной клавиши
&0(0@,1i) = 1@

Offline

#11 16-02-2009 14:57

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

может сюда записывать надо?

0@ = -229908
 008B: 1@ = &0(0@,1i)
div(1@,0x100)
mul(1@,0x100)
1@ += 0x41 //virtual key code нужной клавиши
&0(0@,1i) = 1@

Нет, не подходит

P.S.: Нужно это для создания более реалистичных роликов(а то заставить персонажа перелезть через забор - целая проблема)

Last edited by Gyr (16-02-2009 14:59)


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#12 16-02-2009 18:21

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

Re: Нажатие клавиш

Извините что не в тему, сам вопрос:
у меня есть два актёра, у них в кач-ве оружия коктейль молотова. как заставить их швырять в меня молотовы?

Offline

#13 16-02-2009 18:52

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

Лови

05E2: AS_actor 65@ kill_actor $PLAYER_ACTOR

или

0634: AS_actor 65@ attack_using_weapon_actor $PLAYER_ACTOR  unknown 4 unknown 2000 unknown 100

Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#14 16-02-2009 19:23

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

Re: Нажатие клавиш

большое спасибо.

Offline

#15 19-02-2009 15:38

GTASA
Registered: 13-09-2008
Posts: 476

Re: Нажатие клавиш

Извините, но я так и не поняд как создаются скрипты с активацией, подобной читам. Объясните пожалйста подробно и на примере слова "weap".

Offline

#16 19-02-2009 17:16

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

Вот:

{$VERSION 3.1.0027}
{$CLEO .cs}

//-------------MAIN---------------
03A4: name_thread 'WEAP' 

:WEAP_11
0006: 0@ = -229908 
0002: jump @WEAP_28 

:WEAP_28
00D6: if 
0038:   &0(0@,1i) == 0x57454150 // 
004D: jump_if_false @WEAP_71 
03E5: show_text_box 'CHEAT1'  // Cheat activated
0002: jump @WEAP_83 

:WEAP_71
0001: wait 1000 ms 
0002: jump @WEAP_28 

:WEAP_83
0001: wait 60000 ms 
0002: jump @WEAP_11

Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#17 19-02-2009 17:53

Alien
Registered: 12-10-2008
Posts: 564

Re: Нажатие клавиш

вот тебе примеры:

//cheat '1234567890'
0@ = -229906
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x10000)
mul(1@, 0x10000)
0062: 2@ -= 1@
if
2@ == 0x3132
then
0@ = -229907
if
&0(0@,1i) == 0x33343536
then
0@ = -229908
if
&0(0@,1i) == 0x37383930
then
//то, что должно быть выполнено при наборе чита
03E5: text_box 'CHEAT1'  // Cheat activated
while &0(0@,1i) == 0x37383930
wait 0
end
end
end
end
//cheat 'cheat'
0@ = -229907
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x100)
mul(1@, 0x100)
0062: 2@ -= 1@
if
2@ == 0x43
then
0@ = -229908
if
&0(0@,1i) == 0x48454154
then
//то, что должно быть выполнено при наборе чита
03E5: text_box 'CHEAT1'  // Cheat activated
while &0(0@,1i) == 0x48454154
wait 0
end
end
end
//cheat 'give a lot of money'
0@ = -229904
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x1000000)
mul(1@, 0x1000000)
0062: 2@ -= 1@
if
2@ == 0x474956
then
0@ = -229905
if
&0(0@,1i) == 0x45204120
then
0@ = -229906
if
&0(0@,1i) == 0x4C4F5420
then
0@ = -229907
if
&0(0@,1i) == 0x4F46204D
then
0@ = -229908
if
&0(0@,1i) == 0x4F4E4559
then
//то, что должно быть выполнено при наборе чита
03E5: text_box 'CHEAT1'  // Cheat activated
while &0(0@,1i) == 0x4F4E4559
wait 0
end
end
end
end
end
end
//cheat 'hello world'
0@ = -229906
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x1000000)
mul(1@, 0x1000000)
0062: 2@ -= 1@
if
2@ == 0x48454C
then
0@ = -229907
if
&0(0@,1i) == 0x4C4F2057
then
0@ = -229908
if
&0(0@,1i) == 0x4F524C44
then
//то, что должно быть выполнено при наборе чита
03E5: text_box 'CHEAT1'  // Cheat activated
while &0(0@,1i) == 0x4F524C44
wait 0
end
end
end
end

Вот как я понимаю (не факт, что правильно):
Коды нажимаемых клавиш записываются в память в обратном порядке начиная со смещения -229908 относительно начала scm. Мы можем считать эту память

0006: 0@ = -229908 
&0(0@,1i) == 0x57454150

Считываются первые 4 байта. 1 клавиша - один байт.
w - 0x57
e - 0x45
a - 0x41
p - 0x50
предпоследняя четверка нажатых клавиш - по адресу относительно начала scm -229907. Принцип тот же самый. Когда нужно прочесть n клавиш не кратное 4, нужно разделить значение по адресу на (0x100 *n) при помощи div. При этом отбросится дробная часть. Умножив (mul) на то же самое 0x100 *n и вычев полученное значение из начального, получим нужное количество младших байт. Это первые нажатые клавиши в текущей четверке. Смотри параллельно с примерами.

Приаттачиваю прогу. Написал, для одного скрипта, потом переделал под общий случай.

Last edited by Alien (20-02-2009 15:10)

Offline

#18 19-02-2009 18:03

Gyr
From: Серпухов
Registered: 03-02-2009
Posts: 246
Website

Re: Нажатие клавиш

Приаттачиваю прогу. Написал, для одного скрипта, потом переделал под общий случай.
Attachments:
Cheat_generator.zip

Не работает. Пишет что rtl70.bpl не найден

Last edited by Gyr (19-02-2009 18:15)


Специально для тех, кто не умеет читать по английски. Мой ник читается как "ГИР"!!!
Народная мудрость:
Прежде чем задавать вопросы,ПОЧИТАЙ СПРАВКУ!!!!

Offline

#19 19-02-2009 18:26

Alien
Registered: 12-10-2008
Posts: 564

Re: Нажатие клавиш

сори, забыл. Щас перекомпилирую.=)

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

Last edited by Alien (19-02-2009 18:31)

Offline

#20 19-02-2009 20:24

GTASA
Registered: 13-09-2008
Posts: 476

Re: Нажатие клавиш

Читал вдумчиво и внимательно, но не понял ничего grin
Наверное, я просто тупой, вы уж извините. Буду пользоваться программой. Спасибо за нее!
Посмотрите, я правильно вставил? Оно почему-то не работает:

// 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 
wait 0 
0@ = 304526 

:NONAME_16
wait 0 
if and
   not Actor.Dead($PLAYER_ACTOR)
0@ = -229908
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x1000000)
mul(1@, 0x1000000)
0062: 2@ -= 1@
if
2@ == 0x574541
then
//то, что должно быть выполнено при наборе чита
03E5: text_box 'CHEAT1'  // Cheat activated
while &0(0@,1i) == 0x574541
wait 0
end
end

else_jump @NONAME_16 
Player.CanMove($PLAYER_CHAR) = False
08D4: 1@ = create_panel_with_title 'FES_WEA' position 31.0 110.0 width 80.0 columns 2 interactive 1 background 1 alignment 0  // ’“ K 
08DB: set_panel 1@ column 0 header 'DUMMY' data 'M4' 'AK' 'SHOTGN1' 'SHOTGN3' 'SHOTGN2' 'STWE003' 'STWE002' 'STWE001' 'GUN3' 'MP5' 'STWE011' 'RIFLE'  // M4 // ak47 // ЂPO…OB K // PA‡PѓBHO  B HT4ECTEP // …OEBO  ЂPO…OB K // ’“CTѓHHѓ  OPE‚ // T X   ’ CTO‚ET // ’ CTO‚ET // M KPO ’O‚“-ABTOMATѓ // CM† // TEK9 // B HTOBKA
08D6: set_panel 1@ column 0 alignment 1 
08D6: set_panel 1@ column 1 alignment 2 
09DB: set_panel 1@ column 0 width 140 
09DB: set_panel 1@ column 1 width 46 
090E: set_panel 1@ active_row 0 

:NONAME_256
wait 0 
if 
0AB0:   key_pressed 13 
else_jump @NONAME_300 
03E6: remove_text_box 
08DA: remove_panel 1@ 
Player.CanMove($PLAYER_CHAR) = False
wait 10 
jump @NONAME_16 

:NONAME_300
wait 0 
if 
0AB0:   key_pressed 16 
else_jump @NONAME_256 
03E6: remove_text_box 
08D7: 2@ = panel 1@ active_row 
Player.CanMove($PLAYER_CHAR) = True
08DA: remove_panel 1@ 

:NONAME_341
wait 0 
if 
  2@ == 0 
else_jump @NONAME_423 
Model.Load(#M4)
038B: load_requested_models 

:NONAME_370
wait 0 
if and
   Model.Available(#M4)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_370 
01B2: give_actor $PLAYER_ACTOR weapon 31 ammo 3800 // Load the weapon model before using this 
Model.Destroy(#M4)
wait 10 
jump @NONAME_16 

:NONAME_423
wait 0 
if 
  2@ == 1 
else_jump @NONAME_505 
Model.Load(#AK47)
038B: load_requested_models 

:NONAME_452
wait 0 
if and
   Model.Available(#AK47)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_452 
01B2: give_actor $PLAYER_ACTOR weapon 30 ammo 3800 // Load the weapon model before using this 
Model.Destroy(#AK47)
wait 10 
jump @NONAME_16 

:NONAME_505
wait 0 
if 
  2@ == 2 
else_jump @NONAME_587 
Model.Load(#CHROMEGUN)
038B: load_requested_models 

:NONAME_534
wait 0 
if and
   Model.Available(#CHROMEGUN)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_534 
01B2: give_actor $PLAYER_ACTOR weapon 25 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#CHROMEGUN)
wait 10 
jump @NONAME_16 

:NONAME_587
wait 10 
if 
  2@ == 3 
else_jump @NONAME_669 
Model.Load(#SHOTGSPA)
038B: load_requested_models 

:NONAME_616
wait 0 
if and
   Model.Available(#SHOTGSPA)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_616 
01B2: give_actor $PLAYER_ACTOR weapon 27 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#SHOTGSPA)
wait 10 
jump @NONAME_16 

:NONAME_669
wait 10 
if 
  2@ == 4 
else_jump @NONAME_751 
Model.Load(#SAWNOFF)
038B: load_requested_models 

:NONAME_698
wait 0 
if and
   Model.Available(#SAWNOFF)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_698 
01B2: give_actor $PLAYER_ACTOR weapon 26 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#SAWNOFF)
wait 10 
jump @NONAME_16 

:NONAME_751
wait 0 
if 
  2@ == 5 
else_jump @NONAME_833 
Model.Load(#DESERT_EAGLE)
038B: load_requested_models 

:NONAME_780
wait 0 
if and
   Model.Available(#DESERT_EAGLE)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_780 
01B2: give_actor $PLAYER_ACTOR weapon 24 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#DESERT_EAGLE)
wait 10 
jump @NONAME_16 

:NONAME_833
wait 0 
if 
  2@ == 6 
else_jump @NONAME_915 
Model.Load(#SILENCED)
038B: load_requested_models 

:NONAME_862
wait 0 
if and
   Model.Available(#SILENCED)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_862 
01B2: give_actor $PLAYER_ACTOR weapon 23 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#SILENCED)
wait 10 
jump @NONAME_16 

:NONAME_915
wait 0 
if 
  2@ == 7 
else_jump @NONAME_997 
Model.Load(#COLT45)
038B: load_requested_models 

:NONAME_944
wait 0 
if and
   Model.Available(#COLT45)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_944 
01B2: give_actor $PLAYER_ACTOR weapon 22 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#COLT45)
wait 10 
jump @NONAME_16 

:NONAME_997
wait 0 
if 
  2@ == 8 
else_jump @NONAME_1079 
Model.Load(#MICRO_UZI)
038B: load_requested_models 

:NONAME_1026
wait 0 
if and
   Model.Available(#MICRO_UZI)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1026 
01B2: give_actor $PLAYER_ACTOR weapon 28 ammo 7000 // Load the weapon model before using this 
Model.Destroy(#MICRO_UZI)
wait 10 
jump @NONAME_16 

:NONAME_1079
wait 0 
if 
  2@ == 9 
else_jump @NONAME_1161 
Model.Load(#MP5LNG)
038B: load_requested_models 

:NONAME_1108
wait 0 
if and
   Model.Available(#MP5LNG)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1108 
01B2: give_actor $PLAYER_ACTOR weapon 29 ammo 7000 // Load the weapon model before using this 
Model.Destroy(#MP5LNG)
wait 10 
jump @NONAME_16 

:NONAME_1161
wait 0 
if 
  2@ == 10 
else_jump @NONAME_1161 
Model.Load(#TEC9)
038B: load_requested_models 

:NONAME_1190
wait 0 
if and
   Model.Available(#TEC9)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1190 
01B2: give_actor $PLAYER_ACTOR weapon 32 ammo 7000 // Load the weapon model before using this 
Model.Destroy(#TEC9)
wait 10 
jump @NONAME_16 
wait 0 
if 
  2@ == 11 
else_jump @NONAME_1325 
Model.Load(#CUNTGUN)
038B: load_requested_models 

:NONAME_1272
wait 0 
if and
   Model.Available(#CUNTGUN)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1272 
01B2: give_actor $PLAYER_ACTOR weapon 33 ammo 3000 // Load the weapon model before using this 
Model.Destroy(#CUNTGUN)
wait 10 
jump @NONAME_16 

:NONAME_1325
wait 0 
if 
  2@ == 12 
else_jump @NONAME_341 
Model.Load(#SNIPER)
038B: load_requested_models 

:NONAME_1354
wait 0 
if and
   Model.Available(#SNIPER)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1354 
01B2: give_actor $PLAYER_ACTOR weapon 34 ammo 3000 // Load the weapon model before using this 
Model.Destroy(#SNIPER)
wait 10 
jump @NONAME_16

Last edited by GTASA (19-02-2009 21:36)

Offline

#21 20-02-2009 12:08

Alien
Registered: 12-10-2008
Posts: 564

Re: Нажатие клавиш

Нашел баг в своей проге. Когда чит состоит из 3 (или 2 или 1) буковок, это работать не будет.

while &0(0@,1i) == 0x574541
wait 0
end

это надо, чтобы исполнение не возвращалось на новую проверку набора, пока не нажата любая клавиша. Иначе проверка будет всегда возвращать true.
А вообще, вот так надо:

:0
wait 0
0@ = -229908
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x1000000)
mul(1@, 0x1000000)
0062: 2@ -= 1@
if
2@ == 0x574541 //Если последние нажатые клавиши wea
jf @0 //Иначе - вернуться назад на проверку
03E5: text_box 'CHEAT1'  // Cheat activated

:1
//И здесь идет твой код.

Прогой-то пользуйся, но с умом.

Offline

#22 20-02-2009 18:39

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

Re: Нажатие клавиш

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

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


:TestCheat
if
    0AA9:    is_game_version_original
then
    10@ = 0x969110 // keypresses buffer 1.0
    11@ = 0xA48960 // mission locals 1.0
else
    10@ = 0x96B790 // keypresses buffer 1.01
    11@ = 0xA4AFE0 // mission locals 1.01
end
// get 0@'s offset
0A9F: 4@ = current_thread_pointer
0A8E: 5@ = 4@ + 0xDC // mission Flag
0A8D: 5@ = read_memory 5@ size 1 virtual_protect 0
if
    5@ == 1
then
    0085: 4@ = 11@
else
    4@ += 0x3C
end
// get cheat string length
6@ = 0
while true
    0A8D: 5@ = read_memory 4@ size 1 virtual_protect 0
    if and
        5@ > 0
        6@ < 16
    then
        inc(4@)
        inc(6@)        
    else
        Break
    end
end
0085: 8@ = 10@
while 6@ > 0
    dec(4@)       
    dec(6@)
    0A8D: 5@ = read_memory 4@ size 1 virtual_protect 0 // last cheat char
    // lowercase to uppercase (a->A)
    if
        5@ > 90
    then
        5@ -= 32
    end
    0A8D: 7@ = read_memory 8@ size 1 virtual_protect 0 // last pressed key
    inc(8@)   
    if
        803B:   5@ <> 7@ // (int)
    then
        059A: return_false
        0AB2: ret 0
    end
end
0A8C: write_memory 10@ size 1 value 0 virtual_protect 0
0485: return_true
0AB2: ret 0

Вставьте предложенный код без изменений в код скрипта (или миссии) и используйте его следующим образом:

{$CLEO}
0000:
while true
    wait 250 ms
    0@s = 'nocops'
    if 
        0AB1: call_scm_func @TestCheat 2 0@ 1@
    then 
        0110: clear_player $PLAYER_CHAR wanted_level
    end
end

переменная 0@s содержит строку чита, которую нужно напечатать в игре (NOCOPS). Строки можно писать в любом регистре. Использовать можно только буквы и цифры.

0AB1: call_scm_func @TestCheat вызывает код проверки чита, который приведен выше. В функцию по частям передается строка для проверки. О том, почему так сделано, читайте здесь.

Если в игре был введен чит, и он совпал с переданной в функцию строкой, проверка вернет true, и выполнится условие, и соответственно те действия, которые вы захотите (в данном примере, будут убраны звезды розыска).

В функцию для проверки можно передавать строку длиной от 1 до 16 символов. Учтите, что если строка превышает 8 символов, то в качестве параметров будут задействованы не 2 переменные (0@ 1@ в примере), а 4 (0@ 1@ 2@ 3@). Например:

{$CLEO}
0000:
while true
    wait 250 ms
    0@v = "leavemealone"
    if 
        0AB1: call_scm_func @TestCheat 4 0@ 1@ 2@ 3@
    then 
        0110: clear_player $PLAYER_CHAR wanted_level
    end
end

Обратите внимание на измененный опкод 0AB1 по сравнению с первым примером, там передается 4 параметра. И переменная не 0@s а 0@v.

Если вы записали строку не в переменную 0@ в другую, например 22@v, тогда вызов функции будет выглядеть так

0AB1: call_scm_func @TestCheat 4 22@ 23@ 24@ 25@

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

{$I TestCheat.inc}

в конце файла.

Вот весь скрипт:

{$CLEO}
0000:
while true
    wait 250 ms
    22@v = "leavemealone"
    if 
        0AB1: call_scm_func @TestCheat 4 22@ 23@ 24@ 25@
    then 
        0110: clear_player $PLAYER_CHAR wanted_level
    end
end    

{$I TestCheat.inc}

Offline

#23 20-02-2009 19:34

Alien
Registered: 12-10-2008
Posts: 564

Re: Нажатие клавиш

хз, мне старый способ удобнее кажется и читать можно не только цифры и буквы, а любые клавиши. Да и ограничение на длину там побольше.=)
А я вот подумал... Можно ведь наверно передавать в функцию не строку, а также - integer
0x61626364 - это будет эквивалентно строке 'abcd'. Или я ошибаюсь?
И что будет если передать, скажем, символ пробела - 0x20?

Offline

#24 20-02-2009 20:19

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

Re: Нажатие клавиш

Да, можно в функцию передать число (0x61626364 - abcd). Но со строкой удобнее, не нужно возиться с ASCII-кодами.
Я не помню учитывает ли игра пробел при вводе чита, возможно что и его можно использовать. Буквы и цифры точно можно.
Ограничение в 16 символов - это максимальная длина строки, очень сомневаюсь, что кому-то потребуется большая длина... Тут больше восьми символов уже запаришься печатать, не говоря про 16.

Offline

#25 20-02-2009 21:47

GTASA
Registered: 13-09-2008
Posts: 476

Re: Нажатие клавиш

Извините, вы так и не ответили никто. Вот я хочу, чтобы скрипт запускался при написании weapon, но почему он не работает? Надо может после end что-то написать?

// 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 
wait 0 
0@ = 304526 

:NONAME_16
wait 0 
if and
   not Actor.Dead($PLAYER_ACTOR)
//cheat 'weapon'
0@ = -229907
008B: 1@ = &0(0@,1i)
0085: 2@ = 1@
div(1@, 0x10000)
mul(1@, 0x10000)
0062: 2@ -= 1@
if
2@ == 0x5745
then
0@ = -229908
if
&0(0@,1i) == 0x41504F4E
then
//то, что должно быть выполнено при наборе чита
03E5: text_box 'CHEAT1'  // Cheat activated
while &0(0@,1i) == 0x41504F4E
wait 0
end
end
end

else_jump @NONAME_16 
Player.CanMove($PLAYER_CHAR) = False
08D4: 1@ = create_panel_with_title 'FES_WEA' position 31.0 110.0 width 80.0 columns 2 interactive 1 background 1 alignment 0  // ’“ K 
08DB: set_panel 1@ column 0 header 'DUMMY' data 'M4' 'AK' 'SHOTGN1' 'SHOTGN3' 'SHOTGN2' 'STWE003' 'STWE002' 'STWE001' 'GUN3' 'MP5' 'STWE011' 'RIFLE'  // M4 // ak47 // ЂPO…OB K // PA‡PѓBHO  B HT4ECTEP // …OEBO  ЂPO…OB K // ’“CTѓHHѓ  OPE‚ // T X   ’ CTO‚ET // ’ CTO‚ET // M KPO ’O‚“-ABTOMATѓ // CM† // TEK9 // B HTOBKA
08D6: set_panel 1@ column 0 alignment 1 
08D6: set_panel 1@ column 1 alignment 2 
09DB: set_panel 1@ column 0 width 140 
09DB: set_panel 1@ column 1 width 46 
090E: set_panel 1@ active_row 0 

:NONAME_256
wait 0 
if 
0AB0:   key_pressed 13 
else_jump @NONAME_300 
03E6: remove_text_box 
08DA: remove_panel 1@ 
Player.CanMove($PLAYER_CHAR) = False
wait 10 
jump @NONAME_16 

:NONAME_300
wait 0 
if 
0AB0:   key_pressed 16 
else_jump @NONAME_256 
03E6: remove_text_box 
08D7: 2@ = panel 1@ active_row 
Player.CanMove($PLAYER_CHAR) = True
08DA: remove_panel 1@ 

:NONAME_341
wait 0 
if 
  2@ == 0 
else_jump @NONAME_423 
Model.Load(#M4)
038B: load_requested_models 

:NONAME_370
wait 0 
if and
   Model.Available(#M4)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_370 
01B2: give_actor $PLAYER_ACTOR weapon 31 ammo 3800 // Load the weapon model before using this 
Model.Destroy(#M4)
wait 10 
jump @NONAME_16 

:NONAME_423
wait 0 
if 
  2@ == 1 
else_jump @NONAME_505 
Model.Load(#AK47)
038B: load_requested_models 

:NONAME_452
wait 0 
if and
   Model.Available(#AK47)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_452 
01B2: give_actor $PLAYER_ACTOR weapon 30 ammo 3800 // Load the weapon model before using this 
Model.Destroy(#AK47)
wait 10 
jump @NONAME_16 

:NONAME_505
wait 0 
if 
  2@ == 2 
else_jump @NONAME_587 
Model.Load(#CHROMEGUN)
038B: load_requested_models 

:NONAME_534
wait 0 
if and
   Model.Available(#CHROMEGUN)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_534 
01B2: give_actor $PLAYER_ACTOR weapon 25 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#CHROMEGUN)
wait 10 
jump @NONAME_16 

:NONAME_587
wait 10 
if 
  2@ == 3 
else_jump @NONAME_669 
Model.Load(#SHOTGSPA)
038B: load_requested_models 

:NONAME_616
wait 0 
if and
   Model.Available(#SHOTGSPA)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_616 
01B2: give_actor $PLAYER_ACTOR weapon 27 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#SHOTGSPA)
wait 10 
jump @NONAME_16 

:NONAME_669
wait 10 
if 
  2@ == 4 
else_jump @NONAME_751 
Model.Load(#SAWNOFF)
038B: load_requested_models 

:NONAME_698
wait 0 
if and
   Model.Available(#SAWNOFF)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_698 
01B2: give_actor $PLAYER_ACTOR weapon 26 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#SAWNOFF)
wait 10 
jump @NONAME_16 

:NONAME_751
wait 0 
if 
  2@ == 5 
else_jump @NONAME_833 
Model.Load(#DESERT_EAGLE)
038B: load_requested_models 

:NONAME_780
wait 0 
if and
   Model.Available(#DESERT_EAGLE)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_780 
01B2: give_actor $PLAYER_ACTOR weapon 24 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#DESERT_EAGLE)
wait 10 
jump @NONAME_16 

:NONAME_833
wait 0 
if 
  2@ == 6 
else_jump @NONAME_915 
Model.Load(#SILENCED)
038B: load_requested_models 

:NONAME_862
wait 0 
if and
   Model.Available(#SILENCED)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_862 
01B2: give_actor $PLAYER_ACTOR weapon 23 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#SILENCED)
wait 10 
jump @NONAME_16 

:NONAME_915
wait 0 
if 
  2@ == 7 
else_jump @NONAME_997 
Model.Load(#COLT45)
038B: load_requested_models 

:NONAME_944
wait 0 
if and
   Model.Available(#COLT45)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_944 
01B2: give_actor $PLAYER_ACTOR weapon 22 ammo 4000 // Load the weapon model before using this 
Model.Destroy(#COLT45)
wait 10 
jump @NONAME_16 

:NONAME_997
wait 0 
if 
  2@ == 8 
else_jump @NONAME_1079 
Model.Load(#MICRO_UZI)
038B: load_requested_models 

:NONAME_1026
wait 0 
if and
   Model.Available(#MICRO_UZI)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1026 
01B2: give_actor $PLAYER_ACTOR weapon 28 ammo 7000 // Load the weapon model before using this 
Model.Destroy(#MICRO_UZI)
wait 10 
jump @NONAME_16 

:NONAME_1079
wait 0 
if 
  2@ == 9 
else_jump @NONAME_1161 
Model.Load(#MP5LNG)
038B: load_requested_models 

:NONAME_1108
wait 0 
if and
   Model.Available(#MP5LNG)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1108 
01B2: give_actor $PLAYER_ACTOR weapon 29 ammo 7000 // Load the weapon model before using this 
Model.Destroy(#MP5LNG)
wait 10 
jump @NONAME_16 

:NONAME_1161
wait 0 
if 
  2@ == 10 
else_jump @NONAME_1161 
Model.Load(#TEC9)
038B: load_requested_models 

:NONAME_1190
wait 0 
if and
   Model.Available(#TEC9)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1190 
01B2: give_actor $PLAYER_ACTOR weapon 32 ammo 7000 // Load the weapon model before using this 
Model.Destroy(#TEC9)
wait 10 
jump @NONAME_16 
wait 0 
if 
  2@ == 11 
else_jump @NONAME_1325 
Model.Load(#CUNTGUN)
038B: load_requested_models 

:NONAME_1272
wait 0 
if and
   Model.Available(#CUNTGUN)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1272 
01B2: give_actor $PLAYER_ACTOR weapon 33 ammo 3000 // Load the weapon model before using this 
Model.Destroy(#CUNTGUN)
wait 10 
jump @NONAME_16 

:NONAME_1325
wait 0 
if 
  2@ == 12 
else_jump @NONAME_341 
Model.Load(#SNIPER)
038B: load_requested_models 

:NONAME_1354
wait 0 
if and
   Model.Available(#SNIPER)
   Player.Defined($PLAYER_CHAR)
   not wasted_or_busted 
else_jump @NONAME_1354 
01B2: give_actor $PLAYER_ACTOR weapon 34 ammo 3000 // Load the weapon model before using this 
Model.Destroy(#SNIPER)
wait 10 
jump @NONAME_16

Offline

Board footer

Powered by FluxBB