#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: Нажатие клавиш

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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: Нажатие клавиш

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

1
2
3
4
5
6
7
8
: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,156

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: Нажатие клавиш

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

1
2
3
4
5
6
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: Нажатие клавиш

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

1
2
3
4
5
6
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: Нажатие клавиш

Лови

1
05E2: AS_actor 65@ kill_actor $PLAYER_ACTOR

или

1
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: Нажатие клавиш

Вот:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{$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: Нажатие клавиш

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//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. Мы можем считать эту память

1
2
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
Наверное, я просто тупой, вы уж извините. Буду пользоваться программой. Спасибо за нее!
Посмотрите, я правильно вставил? Оно почему-то не работает:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
// 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) буковок, это работать не будет.

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
: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,156

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

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
: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

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

1
2
3
4
5
6
7
8
9
10
11
{$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@). Например:

1
2
3
4
5
6
7
8
9
10
11
{$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, тогда вызов функции будет выглядеть так

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

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

1
{$I TestCheat.inc}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
{$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,156

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

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

Offline

#25 20-02-2009 21:47

GTASA
Registered: 13-09-2008
Posts: 476

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
// 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