#1 10-03-2010 00:26

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Проехал на красный - получи звезду! [CLEO/REL]

Теперь за проезд запрещающего сигнала светофора вы получите 1 звезду интереса полиции (если в момент проезда звёзд у вас не было).
Скрипт включается в работу, только если игрок не управляет летательным транспортом, водным транспортом, или поездом (исключение - трамвай).
Если на автомобиле игрока включена сирена (автомашина спецслужб), то при проезде красного сигнала звезда выдаваться не будет.
Для работы скрипта требуется библиотека CLEO 3 и SANewOpcodes.cleo (Новые КЛЕО-опкоды от Alien: {$CLEO} var 1@ : Integer 2@ : Integer 3@ : Integer 4@ : Integer 12@ : Integer 13@ : Integer 24@ : Integer 26@ : Integer end const Player_WAS_in_front_of_red_traffic_light = 1@ Traffic_light_type = 2@ // 1 or 2 Type_of_red_traffic_light = 3@ // 0,1,2,3 0 - both not red 3 - both red Player_IS_in_front_of_red_traffic_light = 4@ Traffic_light_handle = 24@ Traffic_light_model = 26@ end 5@ = 30000.0 6@ = 30000.0 //---------------------------------------------------------------------------------------------------- while true wait 0 if player.Defined($PLAYER_CHAR) then if and actor.Driving($PLAYER_ACTOR) 84A7: not actor $PLAYER_ACTOR driving_boat 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle then if or 89AE: not actor $PLAYER_ACTOR driving_train actor.DrivingVehicleType($PLAYER_ACTOR 449) then 03C0: 11@ = actor $PLAYER_ACTOR car if 8ABD: not vehicle 11@ siren_on then //--------------------------------------------------------------------------Определяем ближайший светофор actor.StorePos($PLAYER_ACTOR 15@ 16@ 17@) 0B13: 18@ = random_object_near_point 15@ 16@ 17@ in_radius 30.0 find_next 1 // 60.0 0509: 23@ = distance_between_XY 15@ 16@ and_XY 5@ 6@ if 03CA: object 18@ exists then 0984: 19@ = object 18@ model if 0AB1: call_scm_func @is_Object_Traffic_Light 1 19@ 20@ then object.StorePos(18@ 21@ 22@ 23@) actor.StorePos($player_actor 15@ 16@ 17@) 0509: 23@ = distance_between_XY 15@ 16@ and_XY 5@ 6@ 0509: 17@ = distance_between_XY 15@ 16@ and_XY 21@ 22@ if and // если светофоры слишком далеко, то интереса они не представляют 23@ > 100.0 17@ > 100.0 then 14@ = 0 continue end if 0025: 23@ > 17@ // (float) then 14@ = 0 0085: Traffic_light_handle = 18@ // (int) 0085: Traffic_light_model = 19@ // (int) 0087: 5@ = 21@ // (float) 0087: 6@ = 22@ // (float) 0176: 25@ = object Traffic_light_handle Z_angle 02F6: 7@ = cosine 25@ // (float) синус 02F7: 8@ = sine 25@ // (float) косинус 0073: 7@ /= 8@ // (float) тангенс //----------------------------------Определяем тип светофора if and 25@ >= 60.0 25@ <= 150.0 then Traffic_light_type = 2 else if and 25@ >= 240.0 25@ <= 330.0 then Traffic_light_type = 2 else Traffic_light_type = 1 end end end end end if // если светофор слишком далеко, то интереса он не представляют 23@ > 100.0 then 14@ = 0 continue end //------------------------Определяем позицию игрока относительно светофора actor.StorePos($player_actor 15@ 16@ 17@) 0087: 8@ = 15@ // (float) 0063: 8@ -= 5@ // (float) 006B: 8@ *= 7@ // (float) 005B: 8@ += 6@ // (float) if or 25@ < 90.0 25@ > 270.0 then if 0025: 8@ > 16@ // (float) Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 25@ == 90.0 then if 0025: 15@ > 5@ // (float) X_act > X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 25@ == 270.0 then if 0025: 5@ > 15@ // (float) X_act < X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else // Z > 90 AND Z < 270 if 0025: 16@ > 8@ // (float) Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end end end end //------------------------------------------------------------------------ if 14@ == 0 then if or // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале) Traffic_light_model == 3855 Traffic_light_model == 1315 Traffic_light_model == 1352 Traffic_light_model == 1350 Traffic_light_model == 1351 Traffic_light_model == 3516 then if Player_IS_in_front_of_red_traffic_light == True then 14@ = 1 end else if or // Список светофоров, запрещённых к пересечению и спереди, и сзади Traffic_light_model == 1283 Traffic_light_model == 1284 then 14@ = 1 end end else if 14@ == 2 then if Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light then 14@ = 3 end end end Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light //---------------------------Определяем текущие цвета светофоров типов 1 и 2 0AA7: call_function 0x49d310 num_params 0 pop 0 12@ // _?TimeToSwitchTrafficLightToRed 0AA7: call_function 0x49d350 num_params 0 pop 0 13@ // _?TimeToSwitchTrafficLightToYellow if 13@ < 12@ then Type_of_red_traffic_light = 2 else if 13@ > 12@ then Type_of_red_traffic_light = 1 else if or 12@ == 2228480 // cheat All green lights enabled 13@ == 2228480 then Type_of_red_traffic_light = 0 else Type_of_red_traffic_light = 3 // both are red end end end //-------------------------------------------------------------------------- if or Type_of_red_traffic_light == 3 Type_of_red_traffic_light == Traffic_light_type then if 14@ == 1 then 14@ = 2 else if 14@ == 3 then if player.Defined($PLAYER_CHAR) then if 810F: not player $PLAYER_CHAR wanted_level > 0 then 010D: set_player $PLAYER_CHAR wanted_level_to 1 end end 14@ = 0 end end else 14@ = 0 end // type == type else 14@ = 0 end // siren on else 14@ = 0 end else 14@ = 0 end else 14@ = 0 end // player defined end // while main //----------------------------------------------------------------------------------------- :is_Object_Traffic_Light if or 19@ == 3855 // GAY_TRAFFIC_LIGHT 19@ == 1315 // TRAFFICLIGHT1 19@ == 1352 // CJ_TRAFFIC_LIGHT3 19@ == 1350 // CJ_TRAFFIC_LIGHT4 19@ == 1351 // CJ_TRAFFIC_LIGHT5 19@ == 3516 // VGSSTRIPTLIGHTS1 19@ == 1283 // MTRAFFIC1 then 20@ = true else if 19@ == 1284 // MTRAFFIC2 then 20@ = true else 20@ = false end end 0AB2: ret 1 20@

" rel="nofollow">http://sannybuilder.com/forums/viewtopic.php?id=679).
Скрины:
59e4dba03eb9t.jpg 2708063f99fat.jpg

Offline

#2 10-03-2010 04:15

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

Re: Проехал на красный - получи звезду! [CLEO/REL]

Супер скрипт, все его ждали честно!
Классовый, очень полезный, спасибо тебе Den_spb, RESPECT!!!

Но есть предложения:
Чтоб не заморачиваться на звездах, ставишь просто
010E: set_player $PLAYER_CHAR minimum_wanted_level_to 1.


I know everything and nothing...

Offline

#3 10-03-2010 09:19

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Проехал на красный - получи звезду! [CLEO/REL]

Классный скрипт, давно подобное искал! Спасибо, Den!

Offline

#4 10-03-2010 11:48

GTASA
Registered: 13-09-2008
Posts: 476

Re: Проехал на красный - получи звезду! [CLEO/REL]

Было бы лучше: если копов по близости нет, звезды тоже нет.

Last edited by GTASA (10-03-2010 12:07)

Offline

#5 10-03-2010 15:43

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Благодарю за отзывы.

Но есть предложения:
Чтоб не заморачиваться на звездах, ставишь просто
010E: set_player $PLAYER_CHAR minimum_wanted_level_to 1.

Если будет следующая версия, то можно будет попробовать.

Было бы лучше: если копов по близости нет, звезды тоже нет.

Можно применить принцип кода "Штраф за превышение скорости в городе" ( http://sannybuilder.com/forums/viewtopic.php?id=16&p=1 ). Условие назначения звезды

1
2
3
4
5
if
       810F:   not player $PLAYER_CHAR wanted_level > 0
then
       010D: set_player $PLAYER_CHAR wanted_level_to 1
end

можно переделать следующим образом:

1
2
3
4
5
6
7
080E: store_actor $PLAYER_ACTOR present_ped_event_to 31@
if and
      31@ == 72
      810F:   not player $PLAYER_CHAR wanted_level > 0
then
      010D: set_player $PLAYER_CHAR wanted_level_to 1
end

Offline

#6 10-03-2010 20:56

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

Re: Проехал на красный - получи звезду! [CLEO/REL]

Скрипт в игре не проверял, но код посмотрел, поскольку сам когда то хотел сделать такой же мод (даже копался в ехе в коде светофоров).

Есть одно замечание. Функция is_Object_Traffic_Light в данном скрипте избыточна, поскольку это по сути расширенная проверка. Поскольку scm-функции довольно ресурсоемкие, для оптимизации я бы предложил использовать метод, описанный здесь, и заменить вызов и саму функцию на следующий код:

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
if
  gosub @is_Object_Traffic_Light
then
...
 
:is_Object_Traffic_Light
if or
    19@ == 3855 //   GAY_TRAFFIC_LIGHT
    19@ == 1315 //   TRAFFICLIGHT1
    19@ == 1352 //   CJ_TRAFFIC_LIGHT3
    19@ == 1350 //   CJ_TRAFFIC_LIGHT4
    19@ == 1351 //   CJ_TRAFFIC_LIGHT5
    19@ == 3516 //      VGSSTRIPTLIGHTS1
    19@ == 1283 //       MTRAFFIC1   
then
    0485: return_true
else
    if
        19@ == 1284   //      MTRAFFIC2
    then
        0485: return_true
    end
059A: return_false
end
return

При этом теоретически функцию можно свернуть до след кода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
:is_Object_Traffic_Light
if or
    19@ == 3855 //   GAY_TRAFFIC_LIGHT
    19@ == 1315 //   TRAFFICLIGHT1
    19@ == 1352 //   CJ_TRAFFIC_LIGHT3
    19@ == 1350 //   CJ_TRAFFIC_LIGHT4
    19@ == 1351 //   CJ_TRAFFIC_LIGHT5
    19@ == 3516 //   VGSSTRIPTLIGHTS1
    19@ == 1283 //   MTRAFFIC1   
then
else
    19@ == 1284   //  MTRAFFIC2
end
return

Offline

#7 10-03-2010 21:47

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Хорошо, в следующей версии так и сделаю good

Offline

#8 10-03-2010 21:49

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

Re: Проехал на красный - получи звезду! [CLEO/REL]

Кстате заметил на CLEO 4 не пашет, при том что я код не менял, а просто добавил плагин из архива.

Добавлено:

Так вру я использовал самую последнюю версию плагина из рук Alien'а

Last edited by mfisto (10-03-2010 21:54)


I know everything and nothing...

Offline

#9 10-03-2010 21:53

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Так если есть КЛЕО 4, то SANewOpcodes.cleo не нужен. Насколько я понял, в КЛЕО 4 эти новые опкоды есть.

Offline

#10 13-03-2010 14:27

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

Re: Проехал на красный - получи звезду! [CLEO/REL]

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

Добавлено:
Den_spb помотри вот это.


I know everything and nothing...

Offline

#11 13-03-2010 14:55

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Den_spb помотри вот это.

scm func заменю на gosub, это уже обсудили. Хотя Seemann не говорил, что применение scm func здесь - явная ошибка.

Кстате заметил на CLEO 4 не пашет

Вылетает игра?

Offline

#12 13-03-2010 15:20

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

Re: Проехал на красный - получи звезду! [CLEO/REL]

Посмотри внимательнее я не об этом писал.

Добавлено:
Я о том, что, как ты написал внутри функции, там у тебя 19@, а это не верно в CLEO 4 сделано правильно, там те переменные которые не передаются обнуляются, поэтому должно быть 0@.

Last edited by mfisto (13-03-2010 19:53)


I know everything and nothing...

Offline

#13 13-03-2010 15:24

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Хорошо, на будущее учту.

Offline

#14 14-03-2010 19:49

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

Re: Проехал на красный - получи звезду! [CLEO/REL]

Рекомедую осуществлять следующую проверку для того, чтоб узнать, увидел ли какой нибудь коп cj, когда он проезжает на красный туда же, где стоит проверка на кол-во звезд ->

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
if
0AB1: call_scm_func @GetCopSpotYou 0
...
:GETCOPSPOTYOU
Actor.StorePos($PLAYER_ACTOR, 0@, 1@, 2@)
0006: 16@ = 305868
0006: 6@ = 1988
 
:ACTOR_STARTSEARCH
008B: 16@ = &0(16@,1i) // CPool*
0AB1: call_scm_func @ACTOR_READMEMOFFSET 2 ( 16@ + 8 )^ = 7@  // CPool.Size
0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0        // CPool.pUnits
0006: 10@ = 0
 
:ACTOR_SEARCHLOOPMAIN
0AB1: call_scm_func @ACTOR_READMEMOFFSET 2 ( 11@ + 20 )^ = 4@  // xyz*
8039:   not  4@ == 0
004D: jump_if_false @ACTOR_SEARCHLOOPNEXT
0085: 9@ = 10@ // (int) // counter
0AB1: call_scm_func @ACTOR_READMEMOFFSET 2 ( 16@ + 4 )^ = 4@ // CPool.flags
005A: 4@ += 9@ // (int)
0A8D: 4@ = read_memory 4@ size 1 virtual_protect 0
0012: 9@ *= 256
005A: 9@ += 4@ // (int)
 
:ACTOR_TESTACTORHANDLE
056D:   is 9@ valid_actor_handle
004D: jump_if_false @ACTOR_NOHANDLE
00D6: if and
803C:   not $PLAYER_ACTOR == 9@ // (int)
8118:   not actor 9@ dead
004D: jump_if_false @ACTOR_NOHANDLE
089F: get_actor 9@ pedtype_to 17@
        17@ == 6
004D: jump_if_false @ACTOR_NOHANDLE
8364:  not actor 9@ spotted_actor $PLAYER_ACTOR
004D: jump_if_false @ACTOR_NEWSEARCHRADIUS
 
:ACTOR_NOHANDLE
0002: jump @ACTOR_SEARCHLOOPNEXT
 
:ACTOR_NEWSEARCHRADIUS
0485: return_true
jump @ACTOR_SEARCHFINISH
 
:ACTOR_SEARCHLOOPNEXT
005A: 11@ += 6@ // (int)
000A: 10@ += 1
002D:   10@ >= 7@ // (int)
004D: jump_if_false @ACTOR_SEARCHLOOPMAIN
059A: return_false
 
:ACTOR_SEARCHFINISH
0AB2: ret 0
 
:ACTOR_READMEMOFFSET
0A8E: 0@ = 0@ + 1@ // int
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0AB2: ret 1 0@

Просто я заметил как и многие надеюсь, путем event выловить в нужный момент нужный не всегда удается, поэтому я применил бы вот этот способ к этому скрипту.


I know everything and nothing...

Offline

#15 17-03-2010 20:42

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Проехал на красный - получи звезду! [CLEO/REL]

Если поворачиваешь на дороге или едешь по трассе, которая над светофорами, дают звезду. Чо делать?.. smile

Last edited by ~AquaZ~ (17-03-2010 20:52)

Offline

#16 18-03-2010 12:38

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Такое случается в некоторых местах (например, эстакада в Лос Сантосе). Проблему предполагаю решить добавлением проверки "no_obstacles solid 1" (есть ли статические объекты между игроком и светофором).

Offline

#17 07-04-2010 21:52

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Версия 2:

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
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
//Проехал на красный - получи звезду 2 (клео-скрипт для гта са)
{$CLEO}
var
    17@ : Integer
    18@ : Integer
    6@ : Integer
    8@ : Integer
    29@ : Integer
    30@ : Integer
    25@ : Integer
end
const
    Player_WAS_in_front_of_red_traffic_light = 17@
    Traffic_light_type = 18@                     //   1 or 2
    Type_of_red_traffic_light = 6@              // 0,1,2,3         0 - both not red       3 - both red
    Player_IS_in_front_of_red_traffic_light = 8@
    Traffic_light_model = 25@
end
19@ = 30000.0
20@ = 30000.0
//----------------------------------------------------------------------------------------------------
while true
    wait 0
    if
        player.Defined($PLAYER_CHAR)
    then
        if and
            actor.Driving($PLAYER_ACTOR)
            84A7:   not actor $PLAYER_ACTOR driving_boat
            84C8:   not actor $PLAYER_ACTOR driving_flying_vehicle
        then
            if or
                89AE: not actor $PLAYER_ACTOR driving_train
                actor.DrivingVehicleType($PLAYER_ACTOR 449)
            then
                03C0: 28@ = actor $PLAYER_ACTOR car
                if
                    8ABD: not vehicle 28@ siren_on
                then
                    //--------------------------------------------------------------------------Определяем ближайший светофор
                    actor.StorePos($PLAYER_ACTOR 0@ 1@ 2@)
                    3@ = 30.0
              //      gosub @AIC_GETOBJECT
                    0B13: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1 // 60.0
                    0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                    if
                        03CA:   object 9@ exists
                    then
                        0984: 31@ = object 9@ model
                        gosub @is_Object_Traffic_Light
                        if
                            31@ <> 0
                        then
                            object.StorePos(9@ 12@ 13@ 26@)
                            actor.StorePos($player_actor 0@ 1@ 2@)
                            0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                            0509: 2@ = distance_between_XY 0@ 1@ and_XY 12@ 13@
                            if
                                0025:   14@ > 2@ // (float)
                            then
                                23@ = 0
                                0085: Traffic_light_model = 31@ // (int)          
                                0087: 19@ = 12@ // (float)
                                0087: 20@ = 13@ // (float)
                                0087: 27@ = 26@ // (float)
                                0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                                0176: 24@ = object 9@ Z_angle
                                02F6: 10@ = cosine 24@ // (float)  синус
                                02F7: 22@ = sine 24@ // (float)  косинус
                                0073: 10@ /= 22@ // (float)    тангенс
                                //----------------------------------Определяем тип светофора
                                if and
                                    24@ >= 60.0
                                    24@ <= 150.0
                                then
                                    Traffic_light_type = 2
                                else
                                    if and
                                        24@ >= 240.0
                                        24@ <= 330.0
                                    then
                                        Traffic_light_type = 2
                                    else
                                        Traffic_light_type = 1
                                    end
                                end        
                            end
                        end
                    end
                    actor.StorePos($player_actor 0@ 1@ 2@)
                    27@ += 1.0
                    if and         
                        14@ < 30.0 // если ближайший светофор достаточно близко
                        06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0
                        // и нет препятствий между светофором и игроком
                    then   // иначе интереса светофор не представляют
                        27@ -= 1.0
                    else
                        27@ -= 1.0
                        23@ = 0
                        continue
                    end
                    //------------------------Определяем позицию игрока относительно светофора
                    0087: 22@ = 0@ // (float)
                    0063: 22@ -= 19@ // (float)
                    006B: 22@ *= 10@ // (float)
                    005B: 22@ += 20@ // (float)
                    if or
                        24@ < 90.0
                        24@ > 270.0
                    then
                        if
                            0025:   22@ > 1@ // (float)    Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl
                        then
                            Player_IS_in_front_of_red_traffic_light = True   
                        else
                            Player_IS_in_front_of_red_traffic_light = False
                        end
                    else
                        if
                            24@ == 90.0
                        then
                            if
                                0025:   0@ > 19@ // (float)    X_act > X_tl
                            then
                                Player_IS_in_front_of_red_traffic_light = True
                            else
                                Player_IS_in_front_of_red_traffic_light = False
                            end
                        else
                            if
                                24@ == 270.0
                            then
                                if
                                    0025:   19@ > 0@ // (float)    X_act < X_tl
                                then
                                    Player_IS_in_front_of_red_traffic_light = True
                                else
                                    Player_IS_in_front_of_red_traffic_light = False
                                end
                            else   //  Z > 90  AND Z < 270
                                if
                                    0025:   1@ > 22@ // (float)    Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl
                                then
                                    Player_IS_in_front_of_red_traffic_light = True   
                                else
                                    Player_IS_in_front_of_red_traffic_light = False
                                end
                            end
                        end
                    end   
                    //------------------------------------------------------------------------
                    if
                        23@ == 0
                    then
                        if or      // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале)
                            Traffic_light_model == 3855
                            Traffic_light_model == 1315
                            Traffic_light_model == 1352
                            Traffic_light_model == 1350
                            Traffic_light_model == 1351
                            Traffic_light_model == 3516
                        then
                            if
                                Player_IS_in_front_of_red_traffic_light == True
                            then
                                23@ = 1
                            end
                        else
                            if or   // Список светофоров, запрещённых к пересечению и спереди, и сзади
                                Traffic_light_model == 1283
                                Traffic_light_model == 1284
                            then                               
                                23@ = 1
                            end
                        end
                    else
                        if
                            23@ == 2
                        then
                            if
                                Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light
                            then
                                23@ = 3
                            end
                        end   
                    end
                    Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light  
                    //---------------------------Определяем текущие цвета светофоров типов 1 и 2
                    0AA7: call_function 0x49d310 num_params 0 pop 0 29@  // _?TimeToSwitchTrafficLightToRed
                    0AA7: call_function 0x49d350 num_params 0 pop 0 30@  // _?TimeToSwitchTrafficLightToYellow
                    if
                        30@ < 29@
                    then
                        Type_of_red_traffic_light = 2
                    else
                        if
                            30@ > 29@
                        then
                            Type_of_red_traffic_light = 1
                        else
                            if or
                                29@ == 2228480 // cheat All green lights enabled
                                30@ == 2228480
                            then
                                Type_of_red_traffic_light = 0
                            else
                                Type_of_red_traffic_light = 3 // both are red
                            end                               
                        end
                    end
                    //--------------------------------------------------------------------------
                    if or
                        Type_of_red_traffic_light == 3
                        Type_of_red_traffic_light == Traffic_light_type
                    then
                        if
                            23@ == 1
                        then
                            23@ = 2
                        else
                            if
                                23@ == 3
                            then
                                if
                                    player.Defined($PLAYER_CHAR)
                                then
                                    if
                                        810F:   not player $PLAYER_CHAR wanted_level > 0
                                    then
                                        010D: set_player $PLAYER_CHAR wanted_level_to 1
                                    end                                                                                 
                                end                                  
                                23@ = 0
                            end
                        end   
                    else
                        23@ = 0
                    end        // type == type
                else
                    23@ = 0
                end // siren on
            else
                23@ = 0
            end
        else
            23@ = 0
        end
    else
        23@ = 0
    end // player defined
end // while main
//-----------------------------------------------------------------------------------------
:is_Object_Traffic_Light
if and
    31@ <> 3855 //   GAY_TRAFFIC_LIGHT
    31@ <> 1315 //   TRAFFICLIGHT1
    31@ <> 1352 //   CJ_TRAFFIC_LIGHT3
    31@ <> 1350 //   CJ_TRAFFIC_LIGHT4
    31@ <> 1351 //   CJ_TRAFFIC_LIGHT5
    31@ <> 3516 //      VGSSTRIPTLIGHTS1
    31@ <> 1283 //       MTRAFFIC1   
then
    if
        31@ <> 1284   //      MTRAFFIC2
    then
        31@ = 0
    end
end
return
//-----------------------------------------------------------------------------------------
{
    The Interceptor 1.1
        
    by PLPynton and Seemann   
 
    Parameters:
    0@ - input coord X
    1@ - input coord Y
    2@ - input coord Z
    3@ - search radius
 
    variables 4@..16@ in use
     
    9@ = Result (returns -1 if not found)
            
}
:AIC_GETACTOR
0006: 16@ = 305868
0006: 5@ = @AIC_TESTACTORHANDLE
0006: 6@ = 1988
0002: jump @AIC_STARTSEARCH
 
:AIC_GETVEHICLE
0006: 16@ = 305869
0006: 5@ = @AIC_TESTVEHICLEHANDLE
0006: 6@ = 2584
0006: 8@ = -1
0256:   player $PLAYER_CHAR defined
004D: jump_if_false @AIC_STARTSEARCH
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @AIC_STARTSEARCH
03C0: 8@ = actor $PLAYER_ACTOR car
0002: jump @AIC_STARTSEARCH
 
:AIC_GETOBJECT
0006: 16@ = 305871
0006: 5@ = @AIC_TESTOBJECTHANDLE
0006: 6@ = 412
 
:AIC_STARTSEARCH
008B: 16@ = &0(16@,1i) // CPool*
0AB1: call_scm_func @AIC_READMEMOFFSET 2 ( 16@ + 8 )^ = 7@  // CPool.Size
0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0        // CPool.pUnits
0006: 9@ = -1
0006: 10@ = 0
 
:AIC_SEARCHLOOPMAIN
0AB1: call_scm_func @AIC_READMEMOFFSET 2 ( 11@ + 20 )^ = 4@  // xyz*
8039:   not  4@ == 0
004D: jump_if_false @AIC_SEARCHLOOPNEXT
0AB1: call_scm_func @AIC_READMEMOFFSET 2 ( 4@ + 48 )^ = 12@  // x
0AB1: call_scm_func @AIC_READMEMOFFSET 2 ( 4@ + 52 )^ = 13@  // y
0AB1: call_scm_func @AIC_READMEMOFFSET 2 ( 4@ + 56 )^ = 14@  // z
050A: 15@ = distance_between_XYZ 0@ 1@ 2@ and_XYZ 12@ 13@ 14@
0025:   3@ > 15@ // (float)
004D: jump_if_false @AIC_SEARCHLOOPNEXT
0085: 9@ = 10@ // (int) // counter
0AB1: call_scm_func @AIC_READMEMOFFSET 2 ( 16@ + 4 )^ = 4@ // CPool.flags
005A: 4@ += 9@ // (int)
0A8D: 4@ = read_memory 4@ size 1 virtual_protect 0
0012: 9@ *= 256
005A: 9@ += 4@ // (int)
0002: jump 5@
 
:AIC_TESTVEHICLEHANDLE
056E:   is 9@ valid_vehicle_handle
004D: jump_if_false @AIC_NOHANDLE
00D6: if or
003B:   8@ == 9@ // (int)
0119:   car 9@ wrecked
004D: jump_if_false @AIC_NEWSEARCHRADIUS
0002: jump @AIC_NOHANDLE
 
:AIC_TESTACTORHANDLE
056D:   is 9@ valid_actor_handle
004D: jump_if_false @AIC_NOHANDLE
00D6: if or
003C:   $PLAYER_ACTOR == 9@ // (int)
0118:   actor 9@ dead
004D: jump_if_false @AIC_NEWSEARCHRADIUS
0002: jump @AIC_NOHANDLE
 
:AIC_TESTOBJECTHANDLE
83CA:   not object 9@ exists
004D: jump_if_false @AIC_NEWSEARCHRADIUS
 
:AIC_NOHANDLE
0006: 9@ = -1
0002: jump @AIC_SEARCHLOOPNEXT
 
:AIC_NEWSEARCHRADIUS
return
   use 0051: return to break the loop
   immediately when found at least one actor/car/object,
   does not matter if he's nearest one.
}
 
// v EXTRA SEARCH CRITERIA GOES HERE v
 
{
  21@ contains the handle of an actor/car/object
  that should be excluded from the search result
  (for example a handle found previously).
}
803B:   21@ <> 9@                         //
004D: jump_if_false @AIC_NOHANDLE         //
 
     
0085: 3@ = 15@
 
:AIC_SEARCHLOOPNEXT
005A: 11@ += 6@ // (int)
000A: 10@ += 1
002D:   10@ >= 7@ // (int)
004D: jump_if_false @AIC_SEARCHLOOPMAIN
0051: return
 
:AIC_READMEMOFFSET
0A8E: 0@ = 0@ + 1@ // int
0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
0AB2: ret 1 0@

Во второй версии, как и в первой, для поиска объектов в игре используется опкод 0B13 (по умолчанию). Если вылетает игра, то можно воспользоваться другим спсобом - кодом Interceptor - для этого нужно удалить команду 0B13 и раскомментировать (удалить // ) перед gosub @AIC_GETOBJECT.
Однако при использовании Interceptor игра может подтормаживать (по этой же причине не стал добавлять в скрипт код, предложенный mfisto. Остальные предложения, прозвучавшие в теме, выполнены)

Last edited by Den_spb (10-04-2010 11:46)

Offline

#18 09-04-2010 22:53

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Если поворачиваешь на дороге

Независимо от того, движется машина прямо или поворачивает, запрещено пересекать сзади и спереди консольные светофоры двух моделей, которые светят и взад, и вперёд (см. списки моделей светофоров в исходнике скрипта). Такое условие пришлось ввести потому, что в игре эти светофоры устанавливаются на разных перекрёстках по-разному: где-то "лицом" к центру перекрёстка, а где-то "спиной". В данном случае следует остановиться на перекрёстке и дождаться разрешающего сигнала для завершения поворота.
Светофоры других моделей (светящих в одну сторону) всегда устанавливаются задней стороной к центру перекрёстка - с этой стороны их можно пересекать и, следовательно, совершать поворот на перекрёстке.

Offline

#19 10-04-2010 07:07

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Проехал на красный - получи звезду! [CLEO/REL]

Интересно... Как бы ещё ограничить "звездоприсваивание" по Z-координате, чтобы звезду давало только когда я на дороге - неприятно, когда лечу на F22, и получаю звезду. Или еду на Lamborghini по туннелю для поезов - вдруг звезда.

Offline

#20 10-04-2010 11:41

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

когда лечу на F22, и получаю звезду.

и в первой, и во второй версии есть проверки типа транспорта, которым управляет игрок. Если это воздушный, водный или ж/д транспорт (кроме трамвая), то скрипт работать не будет.

Или еду на Lamborghini по туннелю для поезов

Во второй версии для подобных случаев добавлена проверка: есть ли статические объекты между игроком и светофором. Если проверка подтверждается, то светофор "снимается с учёта". Также во второй версии уменьшен радиус поиска светофоров - 30 м.

Last edited by Den_spb (10-04-2010 11:43)

Offline

#21 07-06-2010 17:58

WinuX
Registered: 06-03-2009
Posts: 138

Re: Проехал на красный - получи звезду! [CLEO/REL]

получи звезду? хм. В игре есть такая штука, как wanted pool. На основе её рассчитывается wanted level. Если поблизости нет копов и ты не в самолёте и не на копотранспорте, пул уменьшается каждую секунду на 2. Можно вместо звезды увеличивать пул на 20, скажем, до достижения 180 (50+ - 1 звезда, 180+ - 2 звезды)

Offline

#22 07-06-2010 21:37

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

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

Offline

#23 09-06-2010 11:41

WinuX
Registered: 06-03-2009
Posts: 138

Re: Проехал на красный - получи звезду! [CLEO/REL]

Ну да, суть в общем понятна smile

Если ехать на значительной скорости, то звезда довольно быстро пропадает.

По моим наблюдениям за этим самым wanted pool-ом, звёзды снимаются если:
1) игрок не рядом с милиционерами
2) игрок не на копомобиле
3) Игрок не на самолёте
как-то так smile

Offline

#24 11-06-2010 20:28

Den_spb
From: Ленинград
Registered: 23-11-2008
Posts: 941
Website

Re: Проехал на красный - получи звезду! [CLEO/REL]

Версия 3 (финальная)
Что нового в этой версии:
1.Мод переделан под библиотеку КЛЕО 4.
2.Звезда выдаётся только в том случае, если поблизости есть полицейский, который стал свидетелем вашего правонарушения.
Код:

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
//Проехал на красный - получи звезду 3 (клео-скрипт для гта са)
{$CLEO}
var
    17@ : Integer
    18@ : Integer
    6@ : Integer
    8@ : Integer
    29@ : Integer
    30@ : Integer
    25@ : Integer
end
const
    Player_WAS_in_front_of_red_traffic_light = 17@
    Traffic_light_type = 18@                             //   1 or 2
    Type_of_red_traffic_light = 6@                      // 0,1,2,3         0 - both not red       3 - both red
    Player_IS_in_front_of_red_traffic_light = 8@
    Traffic_light_model = 25@
end
19@ = 30000.0
20@ = 30000.0
//----------------------------------------------------------------------------------------------------
while true
    wait 0
    if
        player.Defined($PLAYER_CHAR)
    then
        if and
            actor.Driving($PLAYER_ACTOR)
            84A7:   not actor $PLAYER_ACTOR driving_boat
            84C8:   not actor $PLAYER_ACTOR driving_flying_vehicle
        then
            if or
                89AE: not actor $PLAYER_ACTOR driving_train
                actor.DrivingVehicleType($PLAYER_ACTOR, #TRAM)
            then
                03C0: 28@ = actor $PLAYER_ACTOR car
                if
                    8ABD: not vehicle 28@ siren_on
                then
                    //--------------------------------------------------------------------------Определяем ближайший светофор
                    actor.StorePos($PLAYER_ACTOR 0@ 1@ 2@)
                    0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                    if
                        gosub @GET_RANDOM_OBJECT
                    then
                        23@ = 0
                        0085: Traffic_light_model = 31@ // (int)          
                        0087: 19@ = 12@ // (float)
                        0087: 20@ = 13@ // (float)
                        0087: 27@ = 26@ // (float)
                        27@ += 1.0
                        0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                        0176: 24@ = object 9@ Z_angle
                        02F6: 10@ = cosine 24@ // (float)  синус
                        02F7: 22@ = sine 24@ // (float)  косинус
                        0073: 10@ /= 22@ // (float)    тангенс
                        //----------------------------------Определяем тип светофора
                        if and
                            24@ >= 60.0
                            24@ <= 150.0
                        then
                            Traffic_light_type = 2
                        else
                            if and
                                24@ >= 240.0
                                24@ <= 330.0
                            then
                                Traffic_light_type = 2
                            else
                                Traffic_light_type = 1
                            end
                        end        
                    end
                    //-----------------------------------------------------------------Производим проверки от незаслуженных звезд
                    actor.StorePos($player_actor 0@ 1@ 2@)
                    if and         
                        14@ < 30.0 // если ближайший светофор достаточно близко
                        06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0
                        // и нет препятствий между светофором и игроком
                    then   // иначе интереса светофор не представляют
                    else
                        23@ = 0
                        continue
                    end
                    //------------------------Определяем позицию игрока относительно светофора
                    0087: 22@ = 0@ // (float)
                    0063: 22@ -= 19@ // (float)
                    006B: 22@ *= 10@ // (float)
                    005B: 22@ += 20@ // (float)
                    if or
                        24@ < 90.0
                        24@ > 270.0
                    then
                        if
                            0025:   22@ > 1@ // (float)    Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl
                        then
                            Player_IS_in_front_of_red_traffic_light = True   
                        else
                            Player_IS_in_front_of_red_traffic_light = False
                        end
                    else
                        if
                            24@ == 90.0
                        then
                            if
                                0025:   0@ > 19@ // (float)    X_act > X_tl
                            then
                                Player_IS_in_front_of_red_traffic_light = True
                            else
                                Player_IS_in_front_of_red_traffic_light = False
                            end
                        else
                            if
                                24@ == 270.0
                            then
                                if
                                    0025:   19@ > 0@ // (float)    X_act < X_tl
                                then
                                    Player_IS_in_front_of_red_traffic_light = True
                                else
                                    Player_IS_in_front_of_red_traffic_light = False
                                end
                            else   //  Z > 90  AND Z < 270
                                if
                                    0025:   1@ > 22@ // (float)    Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl
                                then
                                    Player_IS_in_front_of_red_traffic_light = True   
                                else
                                    Player_IS_in_front_of_red_traffic_light = False
                                end
                            end
                        end
                    end   
                    //------------------------------------------------------------------------
                    if
                        23@ == 0
                    then
                        if or      // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале)
                            Traffic_light_model == 3855
                            Traffic_light_model == 1315
                            Traffic_light_model == 1352
                            Traffic_light_model == 1350
                            Traffic_light_model == 1351
                            Traffic_light_model == 3516
                        then
                            if
                                Player_IS_in_front_of_red_traffic_light == True
                            then
                                23@ = 1
                            end
                        else
                            if or   // Список светофоров, запрещённых к пересечению и спереди, и сзади
                                Traffic_light_model == 1283
                                Traffic_light_model == 1284
                            then                               
                                23@ = 1
                            end
                        end
                    else
                        if
                            23@ == 2
                        then
                            if
                                Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light
                            then
                                23@ = 3
                            end
                        end   
                    end
                    Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light  
                    //---------------------------Определяем текущие цвета светофоров типов 1 и 2
                    0AA7: call_function 0x49D3A0 num_params 0 pop 0 29@   // Направление 2 (запад-восток)
                    0AA7: call_function 0x49D350 num_params 0 pop 0 30@   // Направление 1 (север-юг)
                    for 16@ = 8 to 31
                        08C3: clear 29@ bit 16@
                        08C3: clear 30@ bit 16@
                    end  // значения функций: 0 - зелёный, 1 - желтый, 2 - красный
                    if
                        30@ == 2
                    then
                        if
                            29@ == 2
                        then
                            Type_of_red_traffic_light = 3 // both are red
                        else
                            Type_of_red_traffic_light = 1
                        end
                    else
                        if
                            29@ == 2
                        then
                            Type_of_red_traffic_light = 2
                        else
                            Type_of_red_traffic_light = 0
                        end           
                    end   
                    //--------------------------------------------------------------------------
                    if or
                        Type_of_red_traffic_light == 3
                        Type_of_red_traffic_light == Traffic_light_type
                    then
                        if
                            23@ == 1
                        then
                            23@ = 2
                        else
                            if
                                23@ == 3
                            then
                                if
                                    player.Defined($PLAYER_CHAR)
                                then
                                    if
                                        810F:   not player $PLAYER_CHAR wanted_level > 0
                                    then
                                        if
                                            gosub @CHECK_ANY_COP_NEAR_PLAYER
                                        then
                                            010D: set_player $PLAYER_CHAR wanted_level_to 1
                                        end
                                    end                                                                                 
                                end                                  
                                23@ = 0
                            end
                        end   
                    else
                        23@ = 0
                    end        // type == type
                else
                    23@ = 0
                end // siren on
            else
                23@ = 0
            end
        else
            23@ = 0
        end
    else
        23@ = 0
    end // player defined
end // while main
//-----------------------------------------------------------------------------------------
 
:GET_RANDOM_OBJECT
if
    0AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 0
then
    repeat
        0984: 31@ = object 9@ model
        if and
            31@ <> 3855 //   GAY_TRAFFIC_LIGHT      +
            31@ <> 1315 //   TRAFFICLIGHT1          +
            31@ <> 1352 //   CJ_TRAFFIC_LIGHT3      +
            31@ <> 1350 //   CJ_TRAFFIC_LIGHT4      +
            31@ <> 1351 //   CJ_TRAFFIC_LIGHT5      +
            31@ <> 3516 //      VGSSTRIPTLIGHTS1    +
            31@ <> 1283 //       MTRAFFIC1          +
        then
            if
                31@ <> 1284   //      MTRAFFIC2      +
            then
                31@ = 0
            end
        end
        if
            31@ <> 0
        then
            object.StorePos(9@ 12@ 13@ 26@)
            0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
            0509: 3@ = distance_between_XY 0@ 1@ and_XY 12@ 13@       
            if
                0025:   14@ > 3@ // (float)    
            then
                0485: return_true
                return
            end
        end
    until 8AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1
end
8485: return_false
return
 
:CHECK_ANY_COP_NEAR_PLAYER
if
    0AE1: 21@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 0 pass_deads 1 //IF and SET
then
    repeat
        089F: get_actor 21@ pedtype_to 16@
        if and
            16@ == 6
            0364: actor 21@ spotted_actor $PLAYER_ACTOR
        then
            0485: return_true
            return
        end
    until 8AE1: not 21@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 1 pass_deads 1 //IF and SET
end
8485: return_false
return

Есть и другая, визуальная версия скрипта, которая демонстрирует, как работает мод (ей я пользовался на этапе тестирования):
-рядом с ближайшим светофором создаётся источник света, с таким же цветом, что и светофор.
-на экран выводится информация о том, спереди или позади ближайшего светофора находится игрок
-над полицейским, заметившим проезд светофора, создаётся маркер.
Код визуальной версии:

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
//Проехал на красный - получи звезду 3 (клео-скрипт для гта са)
{$CLEO}
var
    17@ : Integer
    18@ : Integer
    6@ : Integer
    8@ : Integer
    29@ : Integer
    30@ : Integer
    25@ : Integer
end
const
    Player_WAS_in_front_of_red_traffic_light = 17@
    Traffic_light_type = 18@                             //   1 or 2
    Type_of_red_traffic_light = 6@                      // 0,1,2,3         0 - both not red       3 - both red
    Player_IS_in_front_of_red_traffic_light = 8@
    Traffic_light_model = 25@
end
19@ = 30000.0
20@ = 30000.0
//----------------------------------------------------------------------------------------------------
while true
    wait 0
    if
        player.Defined($PLAYER_CHAR)
    then
        if and
            actor.Driving($PLAYER_ACTOR)
            84A7:   not actor $PLAYER_ACTOR driving_boat
            84C8:   not actor $PLAYER_ACTOR driving_flying_vehicle
        then
            if or
                89AE: not actor $PLAYER_ACTOR driving_train
                actor.DrivingVehicleType($PLAYER_ACTOR, #TRAM)
            then
                03C0: 28@ = actor $PLAYER_ACTOR car
                if
                    8ABD: not vehicle 28@ siren_on
                then
                    //--------------------------------------------------------------------------Определяем ближайший светофор
                    actor.StorePos($PLAYER_ACTOR 0@ 1@ 2@)
                    0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                    if
                        gosub @GET_RANDOM_OBJECT
                    then
                        23@ = 0
                        0085: Traffic_light_model = 31@ // (int)          
                        0087: 19@ = 12@ // (float)
                        0087: 20@ = 13@ // (float)
                        0087: 27@ = 26@ // (float)
                        27@ += 1.0
                        0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
                        0176: 24@ = object 9@ Z_angle
                        02F6: 10@ = cosine 24@ // (float)  синус
                        02F7: 22@ = sine 24@ // (float)  косинус
                        0073: 10@ /= 22@ // (float)    тангенс
                        //----------------------------------Определяем тип светофора
                        if and
                            24@ >= 60.0
                            24@ <= 150.0
                        then
                            Traffic_light_type = 2
                        else
                            if and
                                24@ >= 240.0
                                24@ <= 330.0
                            then
                                Traffic_light_type = 2
                            else
                                Traffic_light_type = 1
                            end
                        end        
                    end
                    //-----------------------------------------------------------------Производим проверки от незаслуженных звезд
                    actor.StorePos($player_actor 0@ 1@ 2@)
                    if and         
                        14@ < 30.0 // если ближайший светофор достаточно близко
                        06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0
                        // и нет препятствий между светофором и игроком
                    then   // иначе интереса светофор не представляют
                    else
                        23@ = 0
                        continue
                    end
                    //------------------------Определяем позицию игрока относительно светофора
                    0087: 22@ = 0@ // (float)
                    0063: 22@ -= 19@ // (float)
                    006B: 22@ *= 10@ // (float)
                    005B: 22@ += 20@ // (float)
                    if or
                        24@ < 90.0
                        24@ > 270.0
                    then
                        if
                            0025:   22@ > 1@ // (float)    Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl
                        then
                            Player_IS_in_front_of_red_traffic_light = True   
                        else
                            Player_IS_in_front_of_red_traffic_light = False
                        end
                    else
                        if
                            24@ == 90.0
                        then
                            if
                                0025:   0@ > 19@ // (float)    X_act > X_tl
                            then
                                Player_IS_in_front_of_red_traffic_light = True
                            else
                                Player_IS_in_front_of_red_traffic_light = False
                            end
                        else
                            if
                                24@ == 270.0
                            then
                                if
                                    0025:   19@ > 0@ // (float)    X_act < X_tl
                                then
                                    Player_IS_in_front_of_red_traffic_light = True
                                else
                                    Player_IS_in_front_of_red_traffic_light = False
                                end
                            else   //  Z > 90  AND Z < 270
                                if
                                    0025:   1@ > 22@ // (float)    Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl
                                then
                                    Player_IS_in_front_of_red_traffic_light = True   
                                else
                                    Player_IS_in_front_of_red_traffic_light = False
                                end
                            end
                        end
                    end   
                    //------------------------------------------------------------------------
                    if
                        23@ == 0
                    then
                        if or      // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале)
                            Traffic_light_model == 3855
                            Traffic_light_model == 1315
                            Traffic_light_model == 1352
                            Traffic_light_model == 1350
                            Traffic_light_model == 1351
                            Traffic_light_model == 3516
                        then
                            if
                                Player_IS_in_front_of_red_traffic_light == True
                            then
                                23@ = 1
                            end
                        else
                            if or   // Список светофоров, запрещённых к пересечению и спереди, и сзади
                                Traffic_light_model == 1283
                                Traffic_light_model == 1284
                            then                               
                                23@ = 1
                            end
                        end
                    else
                        if
                            23@ == 2
                        then
                            if
                                Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light
                            then
                                23@ = 3
                            end
                        end   
                    end
                    Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light  
                    //---------------------------Определяем текущие цвета светофоров типов 1 и 2
                    0AA7: call_function 0x49D3A0 num_params 0 pop 0 29@   // Направление 2 (запад-восток)
                    0AA7: call_function 0x49D350 num_params 0 pop 0 30@   // Направление 1 (север-юг)
                    for 16@ = 8 to 31
                        08C3: clear 29@ bit 16@
                        08C3: clear 30@ bit 16@
                    end  // значения функций: 0 - зелёный, 1 - желтый, 2 - красный
                    if
                        30@ == 2
                    then
                        if
                            29@ == 2
                        then
                            Type_of_red_traffic_light = 3 // both are red
                        else
                            Type_of_red_traffic_light = 1
                        end
                    else
                        if
                            29@ == 2
                        then
                            Type_of_red_traffic_light = 2
                        else
                            Type_of_red_traffic_light = 0
                        end           
                    end   
                    //-------------------------------------------------------------------------
                    03F0: enable_text_draw 1   /////////////////////////////////////////////////////////////////////////////////////////////////
                    045A: draw_text_1number 500.0 340.0 GXT 'NUMBER' number 888888888 // ~1~
                    if
                        Player_IS_in_front_of_red_traffic_light == True
                    then
                        5@ = 350.0
                    else
                        5@ = 330.0
                    end
                    045A: draw_text_1number 520.0 5@ GXT 'NUMBER' number 8 // ~1~
                    if or
                        Type_of_red_traffic_light == 3
                        Type_of_red_traffic_light == Traffic_light_type
                    then
                        024F: create_corona_with_radius 1.0 type 2 lensflares 0 with_color 255 0 0 at 19@ 20@ 27@
                    else
                        024F: create_corona_with_radius 1.0 type 2 lensflares 0 with_color 0 255 0 at 19@ 20@ 27@
                    end        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    //--------------------------------------------------------------------------
                    if or
                        Type_of_red_traffic_light == 3
                        Type_of_red_traffic_light == Traffic_light_type
                    then
                        if
                            23@ == 1
                        then
                            23@ = 2
                        else
                            if
                                23@ == 3
                            then
                                if
                                    player.Defined($PLAYER_CHAR)
                                then
                                    if
                                        810F:   not player $PLAYER_CHAR wanted_level > 0
                                    then
                                        if
                                            gosub @CHECK_ANY_COP_NEAR_PLAYER
                                        then
                                            010D: set_player $PLAYER_CHAR wanted_level_to 1
                                        end
                                    end                                                                                 
                                end                                  
                                23@ = 0
                            end
                        end   
                    else
                        23@ = 0
                    end        // type == type
                else
                    23@ = 0
                end // siren on
            else
                23@ = 0
            end
        else
            23@ = 0
        end
    else
        23@ = 0
    end // player defined
end // while main
//-----------------------------------------------------------------------------------------
 
:GET_RANDOM_OBJECT
if
    0AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 0
then
    repeat
        0984: 31@ = object 9@ model
        if and
            31@ <> 3855 //   GAY_TRAFFIC_LIGHT      +
            31@ <> 1315 //   TRAFFICLIGHT1          +
            31@ <> 1352 //   CJ_TRAFFIC_LIGHT3      +
            31@ <> 1350 //   CJ_TRAFFIC_LIGHT4      +
            31@ <> 1351 //   CJ_TRAFFIC_LIGHT5      +
            31@ <> 3516 //      VGSSTRIPTLIGHTS1    +
            31@ <> 1283 //       MTRAFFIC1          +
        then
            if
                31@ <> 1284   //      MTRAFFIC2      +
            then
                31@ = 0
            end
        end
        if
            31@ <> 0
        then
            object.StorePos(9@ 12@ 13@ 26@)
            0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@
            0509: 3@ = distance_between_XY 0@ 1@ and_XY 12@ 13@       
            if
                0025:   14@ > 3@ // (float)    
            then
                0485: return_true
                return
            end
        end
    until 8AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1
end
8485: return_false
return
 
:CHECK_ANY_COP_NEAR_PLAYER
if
    0AE1: 21@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 0 pass_deads 1 //IF and SET
then
    repeat
        089F: get_actor 21@ pedtype_to 16@
        if and
            16@ == 6
            0364: actor 21@ spotted_actor $PLAYER_ACTOR
        then
            marker.Disable(15@) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            marker.CreateAboveActor(15@ 21@////////////////////////////////////////////////////////////////////////////////////////////////////
            0485: return_true
            return
        end
    until 8AE1: not 21@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 1 pass_deads 1 //IF and SET
end
8485: return_false
return

Скомпилированные скрипты находятся в архиве, прикреплённом к сообщению.

Offline

#25 14-09-2010 10:40

Amaimon
From: Yakutsk
Registered: 20-03-2009
Posts: 11

Re: Проехал на красный - получи звезду! [CLEO/REL]

При заходе в машину вылет моментальный. Видел версию скрипта, которая более ресурсоемка, но не вылетает. Где её можно найти? Заранее спасибо;)


Эпитафия на могиле фидошника: "Меня видно?"

Offline

Board footer

Powered by FluxBB