#51 18-12-2011 17:57

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

Re: Универсальные поворотники [CLEO4/SA/REL]

BullDogHEMI427 wrote:

И как насчёт дополнительных оффсетов для мотоциклов? Например, задние поворотники в 99% случаев сливаются посередине.

Если X-оффсет равен 0, то скрипт увеличивает его до 0.15:

1
2
3
4
5
6
7
8
9
10
if
    0_FrontLightX == 0.0
then
    0_FrontLightX = 0.15
end
if
    0_BackLightX == 0.0
then
    0_BackLightX = 0.15
end

Если этого значения мало, то можно увеличить.

BullDogHEMI427 wrote:

Есть возможность включать поворотники машинам педов, перестраивающихся на шоссе?

Перестроения - это другой вопрос, я его пока не исследовал.

Last edited by Den_spb (18-12-2011 17:58)

Offline

#52 31-12-2011 11:05

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Хммм... Я один заметил, что в некоторых ситуациях на стоящей на месте машине без водителя (например, спавненной автосалоном) включается правый поворотник?


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

Offline

#53 31-12-2011 11:20

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Надо добавить проверку, что в авто сидит водитель.


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

Offline

#54 05-01-2012 03:02

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

Re: Универсальные поворотники [CLEO4/SA/REL]

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

Архив прикреплён к первому сообщению темы.

Поэкспериментировав с функцией короны, выяснил смысл ещё нескольких параметров:

1
0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona

flash_inertia - при меньших значениях корона плавно загорается и потухает (как лампа накаливания), при больших - резко вспыхивает и так же резко гаснет (как стробоскоп).
penetration - проникающая способность короны (толщина объекта, сквозь который корона будет видима), метры.
range_of_visibility - дальность видимости короны, метры.

Offline

#55 06-01-2012 12:13

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Универсальные поворотники [CLEO4/SA/REL]

Круто, как всегда. Жаль увидеть все это вживую смогу только через полгода.

Offline

#56 16-07-2012 21:14

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Универсальные поворотники [CLEO4/SA/REL]

Фух, я конечно уже многое позабыл за год, но вроде как постепенно начинаю вливаться в скриптинг опять.
Последняя версия поворотников, адаптированная под клео 3(управление клавишами A и D, как в первой мафии):

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
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
{$CLEO// убраны опкоды 0B10, 0B15. Добавлена проверка <> 0xFFFF
hex
  02 00 01 @code 00
end
 
:Variables
hex
   00 00 00 00
   00 00 00 00 // 34@
   00 00 00 00 // 35@
   00 00 00 00 // 36@
   00 00 00 00 // 37@
   00 00 00 00 // 38@
   00 00 00 00 // 39@
   00 00 00 00 // 40@
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00 //50
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00 //55
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00 //60
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00 //65
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
   00 00 00 00
end
 
:code
0A9F: 0@ = current_thread_pointer
0A8E: 1@ = 0@ + 0x10
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0
000E: 1@ -= @Variables
000A: 0@ += 0xC4
0A8F: 31@ = 1@ - 0@
0016: 31@ /= 4
const
    0_VehicleHandle = 0@
    0_VehicleStruct = 1@
    0_TractorStruct = 2@
        0_PointAdress = 2@
            0_Adress = 2@
                0_VectorPointer = 2@
    0_PrewPathPointID = 3@  // массив ИД точек
    0_CurrPathPointID = 4@
    0_NextPathPointID = 5@
    0_CarX = 6@
        0_PrewX = 6@            // массив X координат точек
            0_FrontLightX = 6@
    0_CarY = 7@
        0_CurrX = 7@
            0_FrontLightY = 7@
    0_CarZ = 8@
        0_NextX = 8@
            0_FrontLightZ = 8@
    0_CarCamDistForw = 9@
        0_PrewY = 9@           // массив Y координат точек
            0_BackLightX = 9@
    0_CarCamDistBack = 10@
        0_CurrY = 10@
            0_BackLightY = 10@
    0_NextY = 11@
        0_BackLightZ = 11@
    0_CamX = 35@(31@,1i)
    0_CamY = 13@
    0_CamZ = 14@
    0_CurrentCarOfPlayer = 15@
        0_VehicleType = 15@
    0_OldCarOfPlayer = 16@
    0_StatusOfPlayerCar = 17@
    0_CamTargetMirrorX = 18@   
    0_CamTargetMirrorY = 19@   
    0_CamTargetMirrorZ = 20@   
    0_CamTargetX = 21@   
    0_CamTargetY = 22@   
    0_CamTargetZ = 23@
    0_CarDriver = 24@
    0_UnicalNumberOfCorona = 25@
    0_LightsStatus = 26@
    0_Angle1 = 27@
    0_Angle2 = 28@
 
    // 31@
     
    1_RadiusOfSearch = 200.0 // радиус поиска транспорта, м
     
    // Режимы:
    1_Left = 1
    1_Right = 2
    1_Both = 3
end
0_OldCarOfPlayer = -1
while true
    wait 0
     
    if
        not player.defined($player_char)
    then
        continue
    end
 
    if
        32@ > 1000
    then
        32@ = 0
    end
     
    if and
        actor.Driving($PLAYER_ACTOR)
        84C8:   not actor $PLAYER_ACTOR driving_flying_vehicle
        84A7:   not actor $PLAYER_ACTOR driving_boat
        89AE:   not actor $PLAYER_ACTOR driving_train
        not actor.DrivingVehicleType($PLAYER_ACTOR #BMX)
        not actor.DrivingVehicleType($PLAYER_ACTOR #BIKE)
        not actor.DrivingVehicleType($PLAYER_ACTOR #MTBIKE)
    then   
        03C0: 0_CurrentCarOfPlayer = actor $PLAYER_ACTOR car
        046C: 0_CarDriver = car 0_CurrentCarOfPlayer driver
        if
            003B:   0_CarDriver == $PLAYER_ACTOR // (int)
        then
            if
                803B:   not  0_CurrentCarOfPlayer == 0_OldCarOfPlayer // (int)     
            then
                0_StatusOfPlayerCar = 0
                0085: 0_OldCarOfPlayer = 0_CurrentCarOfPlayer // (int)
            end
 
 
            
if and
33@ >= 0
   0AB0:  key_pressed 65 // A
   8AB0: not key_pressed 68 // D
then
   33@ = -2000
end
if and
   33@ > -1800
   33@ < 0
then
   0_StatusOfPlayerCar = 1_Left
   33@ = 0
end
              
if and
33@ >= -2000
0AB0:  key_pressed 68 // D
8AB0: not key_pressed 65 // A
then
   33@ = -4000
end
if and
   33@ > -3800
   33@ < -2000
then
   0_StatusOfPlayerCar = 1_Right
   33@ = 0
end
 
if and
   0_StatusOfPlayerCar <> 0
8AB0: not key_pressed 65 // A
8AB0: not key_pressed 68 // D
then 
   0_StatusOfPlayerCar = 0        
end  
 
if and
0_StatusOfPlayerCar == 1_Left
8AB0: not key_pressed 65 // A
   0AB0:  key_pressed 68 // D
then 
   0_StatusOfPlayerCar = 0    
end
 
if and
0_StatusOfPlayerCar == 1_Right
   0AB0:  key_pressed 65 // A
   8AB0: not key_pressed 68 // D
then 
   0_StatusOfPlayerCar = 0
end  
 
if and
0AB0:  key_pressed 68 // D
0AB0:  key_pressed 65 // A
then
  0_StatusOfPlayerCar = 1_Both         
end 
    
         {   if
                0AB0:  key_pressed 90 // Z
            then
                0_StatusOfPlayerCar = 1_Left
            else
                if
                    0AB0:  key_pressed 88 // X
                then
                    0_StatusOfPlayerCar = 1_Both
                else
                    if
                        0AB0:  key_pressed 67 // C
                    then
                        0_StatusOfPlayerCar = 1_Right
                    else
                        if
                            0AB0:  key_pressed 16 // Shift
                        then
                            0_StatusOfPlayerCar = 0
                        end
                    end                   
                end       
            end    }
        end // CJ -driver         
    end  // actor driving
 
    068D: get_camera_position_to 0_CamTargetMirrorX 0_CamTargetMirrorY 0_CamTargetMirrorZ             
    068E: get_camera_target_point_to 0_CamTargetX 0_CamTargetY 0_CamTargetZ 
    0063: 0_CamTargetX -= 0_CamTargetMirrorX // (float)
    0063: 0_CamTargetY -= 0_CamTargetMirrorY // (float)
    0063: 0_CamTargetZ -= 0_CamTargetMirrorZ // (float)
    0063: 0_CamTargetMirrorX -= 0_CamTargetX // (float)
    0063: 0_CamTargetMirrorY -= 0_CamTargetY // (float)
    0063: 0_CamTargetMirrorZ -= 0_CamTargetZ // (float)
    068D: get_camera_position_to 0_CamX 0_CamY 0_CamZ
    068E: get_camera_target_point_to 0_CamTargetX 0_CamTargetY 0_CamTargetZ
     
    0A9F: 0_UnicalNumberOfCorona = current_thread_pointer
 
0A8D: 12@ = read_memory 0xB74494 size 4 virtual_protect 1
000A: 12@ += 0x4
0A8D: 12@ = read_memory 12@ size 4 virtual_protect 1
for 29@ = 0 to 27904 step 0x100
       0A8D: 0_VehicleHandle = read_memory 12@ size 1 virtual_protect 1
       000A: 12@ += 0x1
        
       if and
       0029:   0_VehicleHandle >= 0x00
       001B:   0x80 > 0_VehicleHandle
       then
           005A: 0_VehicleHandle += 29@ // (int)
           if
           056E: (check) car 0_VehicleHandle defined
           then
             
            if and
            8119:   not car 0_VehicleHandle wrecked
            01AF:   car 0_VehicleHandle sphere 0 in_sphere 0_CamX 0_CamY 0_CamZ radius 1_RadiusOfSearch 1_RadiusOfSearch 1_RadiusOfSearch
            then
            0A97: 0_VehicleStruct = car 0_VehicleHandle struct
            0A8E: 0_VehicleType = 0_VehicleStruct + 1424 // int
            0A8D: 0_VehicleType = read_memory 0_VehicleType size 1 virtual_protect 0
             
            if and
                0_VehicleType <> 0
                0_VehicleType <> 9
            then
                continue
            end
            0AA8: call_function_method 0x6D1080 struct 0_VehicleStruct num_params 0 pop 0 0_VehicleType // _CVehicleBase__getVehicleType
             
            if and
                0_VehicleType <> 1
                0_VehicleType <> 2
            then
                continue
            end           
            0A8E: 0_TractorStruct = 0_VehicleStruct + 0x4C4 // int
            0A8D: 0_TractorStruct = read_memory 0_TractorStruct size 4 virtual_protect 0
            car.StorePos(0_VehicleHandle 0_CarX 0_CarY 0_CarZ)
            050A: 0_CarCamDistBack = distance_between_XYZ 0_CarX 0_CarY 0_CarZ and_XYZ 0_CamTargetMirrorX 0_CamTargetMirrorY 0_CamTargetMirrorZ
            050A: 0_CarCamDistForw = distance_between_XYZ 0_CarX 0_CarY 0_CarZ and_XYZ 0_CamTargetX 0_CamTargetY 0_CamTargetZ          
            if or
                0025:   0_CarCamDistForw > 0_CarCamDistBack // (float)
                0_TractorStruct > 0
                0137:  car 0_VehicleHandle model == #BMX
                0137:  car 0_VehicleHandle model == #BIKE
                0137:  car 0_VehicleHandle model == #MTBIKE
                0686:   car 0_VehicleHandle attached 
            then                   
                continue
            end
            046C: 0_CarDriver = car 0_VehicleHandle driver
            if and
                803B:   not  0_VehicleHandle == 0_OldCarOfPlayer // (int) 
                0_CarDriver <= 0
            then
                continue
            end   
            if
                32@ <= 500
            then
                gosub @Turn_signals_process
            end  
           end
       end
end
    end   
end
 
:__LabelToOffset
if
    0@ == 0
then
    0AB2: ret 1 0
end    
0A9F: 1@ = current_thread_pointer
1@ += 0x10
0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // baseIP
0062: 1@ -= 0@ // label address
0AB2: ret 1 1@
 
 
:__VarToOffset
0A9F: 23@ = current_thread_pointer
23@ += 0x3C
0@ *= 4
005A: 23@ += 0@ // address of the local variable
0AB2: ret 1 23@
 
:Turn_signals_process   
if
    003B:   0_VehicleHandle == 0_OldCarOfPlayer // (int)
then
    0085: 0_LightsStatus = 0_StatusOfPlayerCar // (int)
    gosub @Get_lights_coords
    if or
        0_LightsStatus == 1_Right
        0_LightsStatus == 1_Both
    then
        //0AC7: 0_VectorPointer = var 0_FrontLightX offset
        0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
        //0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end
    if or
        0_LightsStatus == 1_Left
        0_LightsStatus == 1_Both
    then
        0_BackLightX *= -1.0
        0_FrontLightX *= -1.0
        //0AC7: 0_VectorPointer = var 0_FrontLightX offset
        0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
        //0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end       
else
    0_LightsStatus = 0
    0A8E: 0_NextPathPointID = 0_VehicleStruct + 0x3A6 // int   НОМЕР СЛЕДУЮЩЕЙ ТОЧКИ ПУТИ      0x3A6
    0A8E: 0_CurrPathPointID = 0_VehicleStruct + 0x3A4 // int   НОМЕР ТЕКУЩЕЙ ТОЧКИ ПУТИ         0x3A4
    0A8E: 0_PrewPathPointID = 0_VehicleStruct + 0x3A8 // int   НОМЕР ПРЕДЫДУЩЕЙ ТОЧКИ ПУТИ     0x3A8
    0A8D: 0_CurrPathPointID = read_memory 0_CurrPathPointID size 2 virtual_protect 0
    0A8D: 0_NextPathPointID = read_memory 0_NextPathPointID size 2 virtual_protect 0
    0A8D: 0_PrewPathPointID = read_memory 0_PrewPathPointID size 2 virtual_protect 0
    if
        0_CurrPathPointID <> 0xFFFF
    then
        for 31@ = 0 to 2
            if
                3@(31@,3i) <> 0xFFFF
            then   
                0085: 0_PointAdress = 3@(31@,3i) // (int)
                 
                //0AC6: 30@ = label @SHR_0Ah offset
                0AB1: call_scm_func @__LabelToOffset 1 label @SHR_0Ah store_to 30@
                0AA8: call_function_method 30@ struct 3@(31@,3i) num_params 0 pop 0 3@(31@,3i)
             //   0B15: 3@(31@,3i) = 3@(31@,3i) SHR 0xA   ////////////////////////////////////////////////////////////
              
                3@(31@,3i) *= 4
                3@(31@,3i) += 0x96F854
                0A8D: 3@(31@,3i) = read_memory 3@(31@,3i) size 4 virtual_protect 0
                     
                if
                    3@(31@,3i) <> 0
                then
                    0085: 3@(31@,3i) = 0_PointAdress // (int)
     
                    //0AC6: 30@ = label @AND_3FFh offset
                    0AB1: call_scm_func @__LabelToOffset 1 label @AND_3FFh store_to 30@
                    0AA8: call_function_method 30@ struct 0_PointAdress num_params 0 pop 0 0_PointAdress              
                 //   0B10: 0_PointAdress = 0_PointAdress AND 0x3FF ///////////////////////////////////////////////////
                    
                    0_PointAdress *= 0xE
                     
                    //0AC6: 30@ = label @SHR_0Ah offset
                    0AB1: call_scm_func @__LabelToOffset 1 label @SHR_0Ah store_to 30@
                    0AA8: call_function_method 30@ struct 3@(31@,3i) num_params 0 pop 0 3@(31@,3i)               
                  //  0B15: 3@(31@,3i) = 3@(31@,3i) SHR 0xA ///////////////////////////////////////////////////////////
                    
                    3@(31@,3i) *= 4
                    3@(31@,3i) += 0x96F974
                    0A8D: 3@(31@,3i) = read_memory 3@(31@,3i) size 4 virtual_protect 0
                    005A: 0_PointAdress += 3@(31@,3i) // (int)
                             
                    0085: 6@(31@,3i) = 0_PointAdress // (int)
                    0A8E: 9@(31@,3i) = 0_PointAdress + 2 // int
                             
                    0A8D: 6@(31@,3i) = read_memory 6@(31@,3i) size 2 virtual_protect 0
                    if
                        6@(31@,3i) >= 0x8000 // negative word
                    then
                        6@(31@,3i) += 0xFFFF0000 // convert to negative dword
                    end
                    0093: 6@(31@,3i) = integer 6@(31@,3i) to_float
                    6@(31@,3f) /= 8.0
                             
                    0A8D: 9@(31@,3i) = read_memory 9@(31@,3i) size 2 virtual_protect 0
                    if
                        9@(31@,3i) >= 0x8000 // negative word
                    then
                        9@(31@,3i) += 0xFFFF0000 // convert to negative dword
                    end
                    0093: 9@(31@,3i) = integer 9@(31@,3i) to_float
                    9@(31@,3f) /= 8.0  
                end
            else
                6@(31@,3i) = 0.0
                9@(31@,3i) = 0.0
            end // <> 0xFFFF         
        end   // for end 
     
        0063: 0_NextX -= 0_CurrX // (float)
        0063: 0_NextY -= 0_CurrY // (float)
        0063: 0_CurrX -= 0_PrewX // (float)
        0063: 0_CurrY -= 0_PrewY // (float)
      
        0604: get_Z_angle_for_point 0_NextX 0_NextY store_to 0_Angle1
        0604: get_Z_angle_for_point 0_CurrX 0_CurrY store_to 0_Angle2
        0063: 0_Angle1 -= 0_Angle2 // (float)
        0656: get_angle 0_Angle1 absolute_degrees_to 0_Angle1
        if and
            0_Angle1 >= 30.0
            0_Angle1 < 180.0
        then
            0_LightsStatus = 1_Left
        else
            if and
                0_Angle1 <= 330.0
                0_Angle1 > 180.0
            then
                0_LightsStatus = 1_Right
            else
                0_LightsStatus = 0
            end
        end   // LightsStatus
        gosub @Get_lights_coords
        if
            0_LightsStatus == 1_Right
        then
            //0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
            //0AC7: 0_VectorPointer = var 0_BackLightX offset
            0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
        end
        if
            0_LightsStatus == 1_Left
        then
            0_BackLightX *= -1.0
            0_FrontLightX *= -1.0
            //0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AB1: call_scm_func @__VarToOffset 1 varnumber 6 result 0_VectorPointer
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
            //0AC7: 0_VectorPointer = var 0_BackLightX offset
            0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
        end       
    end   // FFFF    3A4    
end
 
0_VehicleStruct += 0x4C8
0A8D: 0_VehicleStruct = read_memory 0_VehicleStruct size 4 virtual_protect 0
if
    0_VehicleStruct > 0
then
    gosub @Get_lights_coords
    if or
        0_LightsStatus == 1_Right
        0_LightsStatus == 1_Both
    then
        //0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end
    if or
        0_LightsStatus == 1_Left
        0_LightsStatus == 1_Both
    then
        0_BackLightX *= -1.0
        //0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AB1: call_scm_func @__VarToOffset 1 varnumber 9 result 0_VectorPointer
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end   
end
   
return
 
:Get_lights_coords
0A8E: 0_Adress = 0_VehicleStruct + 0x22 // int
0A8D: 0_Adress = read_memory 0_Adress size 2 virtual_protect 0 //model index
0_Adress *= 4
0_Adress += 0xA9B0C8
0A8D: 0_Adress = read_memory 0_Adress size 4 virtual_protect 0 //CModel
0_Adress += 0x5C                                       
0A8D: 0_Adress = read_memory 0_Adress size 4 virtual_protect 0 //vehicle struct
0A8D: 0_FrontLightX = read_memory 0_Adress size 4 virtual_protect 0 //x offset
0_Adress += 4
0A8D: 0_FrontLightY = read_memory 0_Adress size 4 virtual_protect 0 //y offset
0_Adress += 4
0A8D: 0_FrontLightZ = read_memory 0_Adress size 4 virtual_protect 0 //z offset
0_Adress += 4
0A8D: 0_BackLightX = read_memory 0_Adress size 4 virtual_protect 0 //x offset
0_Adress += 4
0A8D: 0_BackLightY = read_memory 0_Adress size 4 virtual_protect 0 //y offset
0_Adress += 4
0A8D: 0_BackLightZ = read_memory 0_Adress size 4 virtual_protect 0 //z offset
if
    0_FrontLightX == 0.0
then
    0_FrontLightX = 0.15
end
if
    0_BackLightX == 0.0
then
    0_BackLightX = 0.15
end
return
 
:SHR_0Ah
hex
    C1 E9 0A          // shr ecx, 0xA
    89 C8             // mov eax, ecx
    C3                // retn
end
 
:AND_3FFh
hex
    81 E1 FF 03 00 00 // and ecx, 0x3FF
    89 C8             // mov eax, ecx
    C3                // retn
end
// 0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 15.0 0 penetration 1.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona

Last edited by Sergey81 (16-07-2012 21:18)

Offline

#57 04-07-2014 12:39

Monstr74
Registered: 13-09-2013
Posts: 1

Re: Универсальные поворотники [CLEO4/SA/REL]

Можно ли сделать проекции на земле и освещённость от поворотников? wink

Offline

#58 05-07-2014 18:17

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Да, можно. Сделаем.

Offline

#59 05-07-2014 19:49

Sergey81
Registered: 19-12-2008
Posts: 654

Re: Универсальные поворотники [CLEO4/SA/REL]

Если есть планы по дальнейшей разработке, то предлагаю добавить проверку на совместимость машины с ImVehFt и не отображать поворотники на таких.

Offline

#60 20-03-2016 12:53

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Немного доработал скрипт. В версии 2.2 поворотники на машинах ботов включаются не только при поворотах на перекрестках, но и при перестроениях на шоссе. Проверка намерения перестроиться выглядит так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// проверяем намерение перестроиться (если водитель едет по шоссе)
if
    0_LightsStatus == 0
then
    0A8E: 0_CurrentLane = 0_VehicleStruct + 0x3B7 // int   ТЕКУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
    0A8E: 0_NextLane = 0_VehicleStruct + 0x3B8    // int   БУДУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
    0A8D: 0_CurrentLane = read_memory 0_CurrentLane size 1 virtual_protect 0
    0A8D: 0_NextLane = read_memory 0_NextLane size 1 virtual_protect 0
    if and
        0_CurrentLane == 0
        0_NextLane == 1
    then 
        0_LightsStatus = 1_Right
    end
    if and
        0_CurrentLane == 1
        0_NextLane == 0
    then 
        0_LightsStatus = 1_Left
    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
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
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
{$CLEO// убраны опкоды 0B10, 0B15. Добавлена проверка <> 0xFFFF
const
    0_VehicleHandle = 0@
    0_VehicleStruct = 1@
    0_TractorStruct = 2@
        0_PointAdress = 2@
            0_Adress = 2@
                0_VectorPointer = 2@
    0_PrewPathPointID = 3@  // массив ИД точек
    0_CurrPathPointID = 4@
    0_NextPathPointID = 5@
    0_CarX = 6@
        0_PrewX = 6@            // массив X координат точек
            0_FrontLightX = 6@
    0_CarY = 7@
        0_CurrX = 7@
            0_FrontLightY = 7@
    0_CarZ = 8@
        0_NextX = 8@
            0_FrontLightZ = 8@
    0_CarCamDistForw = 9@
        0_PrewY = 9@           // массив Y координат точек
            0_BackLightX = 9@
    0_CarCamDistBack = 10@
        0_CurrY = 10@
            0_BackLightY = 10@
    0_NextY = 11@
        0_BackLightZ = 11@
    0_CamX = 12@
    0_CamY = 13@
    0_CamZ = 14@
    0_CurrentCarOfPlayer = 15@
        0_VehicleType = 15@
    0_OldCarOfPlayer = 16@
    0_StatusOfPlayerCar = 17@
    0_CamTargetMirrorX = 18@   
    0_CamTargetMirrorY = 19@   
    0_CamTargetMirrorZ = 20@   
    0_CamTargetX = 21@   
    0_CamTargetY = 22@   
    0_CamTargetZ = 23@
    0_CarDriver = 24@
    0_UnicalNumberOfCorona = 25@
    0_LightsStatus = 26@
    0_Angle1 = 27@
        0_CurrentLane = 27@
    0_Angle2 = 28@
        0_NextLane = 28@
 
    // 31@
     
    1_RadiusOfSearch = 200.0 // радиус поиска транспорта, м
     
    // Режимы:
    1_Left = 1
    1_Right = 2
    1_Both = 3
end
0_OldCarOfPlayer = -1
while true
    wait 0
    if
        not player.defined($player_char)
    then
        continue
    end
 
    if
        32@ > 1000
    then
        32@ = 0
    end
     
    if and
        actor.Driving($PLAYER_ACTOR)
        84C8:   not actor $PLAYER_ACTOR driving_flying_vehicle
        84A7:   not actor $PLAYER_ACTOR driving_boat
        89AE:   not actor $PLAYER_ACTOR driving_train
        not actor.DrivingVehicleType($PLAYER_ACTOR #BMX)
        not actor.DrivingVehicleType($PLAYER_ACTOR #BIKE)
        not actor.DrivingVehicleType($PLAYER_ACTOR #MTBIKE)
    then   
        03C0: 0_CurrentCarOfPlayer = actor $PLAYER_ACTOR car
        046C: 0_CarDriver = car 0_CurrentCarOfPlayer driver
        if
            003B:   0_CarDriver == $PLAYER_ACTOR // (int)
        then
            if
                803B:   not  0_CurrentCarOfPlayer == 0_OldCarOfPlayer // (int)     
            then
                0_StatusOfPlayerCar = 0
                0085: 0_OldCarOfPlayer = 0_CurrentCarOfPlayer // (int)
            end
             
            if
                0AB0:  key_pressed 90 // Z
            then
                0_StatusOfPlayerCar = 1_Left
            else
                if
                    0AB0:  key_pressed 88 // X
                then
                    0_StatusOfPlayerCar = 1_Both
                else
                    if
                        0AB0:  key_pressed 67 // C
                    then
                        0_StatusOfPlayerCar = 1_Right
                    else
                        if
                            0AB0:  key_pressed 16 // Shift
                        then
                            0_StatusOfPlayerCar = 0
                        end
                    end                   
                end       
            end
        end // CJ -driver         
    end  // actor driving
 
    068D: get_camera_position_to 0_CamTargetMirrorX 0_CamTargetMirrorY 0_CamTargetMirrorZ             
    068E: get_camera_target_point_to 0_CamTargetX 0_CamTargetY 0_CamTargetZ 
    0063: 0_CamTargetX -= 0_CamTargetMirrorX // (float)
    0063: 0_CamTargetY -= 0_CamTargetMirrorY // (float)
    0063: 0_CamTargetZ -= 0_CamTargetMirrorZ // (float)
    0063: 0_CamTargetMirrorX -= 0_CamTargetX // (float)
    0063: 0_CamTargetMirrorY -= 0_CamTargetY // (float)
    0063: 0_CamTargetMirrorZ -= 0_CamTargetZ // (float)
    068D: get_camera_position_to 0_CamX 0_CamY 0_CamZ
    068E: get_camera_target_point_to 0_CamTargetX 0_CamTargetY 0_CamTargetZ
     
    0A9F: 0_UnicalNumberOfCorona = current_thread_pointer
 
    if
        0AE2: 0_VehicleHandle = random_vehicle_near_point 0_CamX 0_CamY 0_CamZ in_radius 1_RadiusOfSearch find_next 0 pass_wrecked 1 //IF and SET
    then
        repeat
            0A97: 0_VehicleStruct = car 0_VehicleHandle struct
            0A8E: 0_VehicleType = 0_VehicleStruct + 1424 // int
            0A8D: 0_VehicleType = read_memory 0_VehicleType size 1 virtual_protect 0
            if and
                0_VehicleType <> 0
                0_VehicleType <> 9
            then
                continue
            end
            0AA8: call_function_method 0x6D1080 struct 0_VehicleStruct num_params 0 pop 0 0_VehicleType // _CVehicleBase__getVehicleType
            if and
                0_VehicleType <> 1
                0_VehicleType <> 2
            then
                continue
            end           
            0A8E: 0_TractorStruct = 0_VehicleStruct + 0x4C4 // int
            0A8D: 0_TractorStruct = read_memory 0_TractorStruct size 4 virtual_protect 0
            car.StorePos(0_VehicleHandle 0_CarX 0_CarY 0_CarZ)
            050A: 0_CarCamDistBack = distance_between_XYZ 0_CarX 0_CarY 0_CarZ and_XYZ 0_CamTargetMirrorX 0_CamTargetMirrorY 0_CamTargetMirrorZ
            050A: 0_CarCamDistForw = distance_between_XYZ 0_CarX 0_CarY 0_CarZ and_XYZ 0_CamTargetX 0_CamTargetY 0_CamTargetZ          
            if or
                0025:   0_CarCamDistForw > 0_CarCamDistBack // (float)
                0_TractorStruct > 0
                0137:  car 0_VehicleHandle model == #BMX
                0137:  car 0_VehicleHandle model == #BIKE
                0137:  car 0_VehicleHandle model == #MTBIKE
                0686:   car 0_VehicleHandle attached 
            then                   
                continue
            end
            046C: 0_CarDriver = car 0_VehicleHandle driver
            if and
                803B:   not  0_VehicleHandle == 0_OldCarOfPlayer // (int) 
                0_CarDriver <= 0
            then
                continue
            end   
            if
                32@ <= 500
            then
                gosub @Turn_signals_process
            end  
        until 8AE2: not 0_VehicleHandle = random_vehicle_near_point 0_CamX 0_CamY 0_CamZ in_radius 1_RadiusOfSearch find_next 1 pass_wrecked 1 //IF and SET
    end   
end
 
:Turn_signals_process   
if
    003B:   0_VehicleHandle == 0_OldCarOfPlayer // (int)
then
    0085: 0_LightsStatus = 0_StatusOfPlayerCar // (int)
    gosub @Get_lights_coords
    if or
        0_LightsStatus == 1_Right
        0_LightsStatus == 1_Both
    then
        0AC7: 0_VectorPointer = var 0_FrontLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end
    if or
        0_LightsStatus == 1_Left
        0_LightsStatus == 1_Both
    then
        0_BackLightX *= -1.0
        0_FrontLightX *= -1.0
        0AC7: 0_VectorPointer = var 0_FrontLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end       
else
    0_LightsStatus = 0
    0A8E: 0_NextPathPointID = 0_VehicleStruct + 0x3A6 // int   НОМЕР СЛЕДУЮЩЕЙ ТОЧКИ ПУТИ      0x3A6
    0A8E: 0_CurrPathPointID = 0_VehicleStruct + 0x3A4 // int   НОМЕР ТЕКУЩЕЙ ТОЧКИ ПУТИ         0x3A4
    0A8E: 0_PrewPathPointID = 0_VehicleStruct + 0x3A8 // int   НОМЕР ПРЕДЫДУЩЕЙ ТОЧКИ ПУТИ     0x3A8
    0A8D: 0_CurrPathPointID = read_memory 0_CurrPathPointID size 2 virtual_protect 0
    0A8D: 0_NextPathPointID = read_memory 0_NextPathPointID size 2 virtual_protect 0
    0A8D: 0_PrewPathPointID = read_memory 0_PrewPathPointID size 2 virtual_protect 0
    if
        0_CurrPathPointID <> 0xFFFF
    then
        for 31@ = 0 to 2
            if
                3@(31@,3i) <> 0xFFFF
            then   
                0085: 0_PointAdress = 3@(31@,3i) // (int)
                 
                0AC6: 30@ = label @SHR_0Ah offset
                0AA8: call_function_method 30@ struct 3@(31@,3i) num_params 0 pop 0 3@(31@,3i)
             //   0B15: 3@(31@,3i) = 3@(31@,3i) SHR 0xA   ////////////////////////////////////////////////////////////
              
                3@(31@,3i) *= 4
                3@(31@,3i) += 0x96F854
                0A8D: 3@(31@,3i) = read_memory 3@(31@,3i) size 4 virtual_protect 0
                     
                if
                    3@(31@,3i) <> 0
                then
                    0085: 3@(31@,3i) = 0_PointAdress // (int)
     
                    0AC6: 30@ = label @AND_3FFh offset
                    0AA8: call_function_method 30@ struct 0_PointAdress num_params 0 pop 0 0_PointAdress              
                 //   0B10: 0_PointAdress = 0_PointAdress AND 0x3FF ///////////////////////////////////////////////////
                    
                    0_PointAdress *= 0xE
                     
                    0AC6: 30@ = label @SHR_0Ah offset
                    0AA8: call_function_method 30@ struct 3@(31@,3i) num_params 0 pop 0 3@(31@,3i)               
                  //  0B15: 3@(31@,3i) = 3@(31@,3i) SHR 0xA ///////////////////////////////////////////////////////////
                    
                    3@(31@,3i) *= 4
                    3@(31@,3i) += 0x96F974
                    0A8D: 3@(31@,3i) = read_memory 3@(31@,3i) size 4 virtual_protect 0
                    005A: 0_PointAdress += 3@(31@,3i) // (int)
                             
                    0085: 6@(31@,3i) = 0_PointAdress // (int)
                    0A8E: 9@(31@,3i) = 0_PointAdress + 2 // int
                             
                    0A8D: 6@(31@,3i) = read_memory 6@(31@,3i) size 2 virtual_protect 0
                    if
                        6@(31@,3i) >= 0x8000 // negative word
                    then
                        6@(31@,3i) += 0xFFFF0000 // convert to negative dword
                    end
                    0093: 6@(31@,3i) = integer 6@(31@,3i) to_float
                    6@(31@,3f) /= 8.0
                             
                    0A8D: 9@(31@,3i) = read_memory 9@(31@,3i) size 2 virtual_protect 0
                    if
                        9@(31@,3i) >= 0x8000 // negative word
                    then
                        9@(31@,3i) += 0xFFFF0000 // convert to negative dword
                    end
                    0093: 9@(31@,3i) = integer 9@(31@,3i) to_float
                    9@(31@,3f) /= 8.0  
                end
            else
                6@(31@,3i) = 0.0
                9@(31@,3i) = 0.0
            end // <> 0xFFFF         
        end   // for end 
     
        0063: 0_NextX -= 0_CurrX // (float)
        0063: 0_NextY -= 0_CurrY // (float)
        0063: 0_CurrX -= 0_PrewX // (float)
        0063: 0_CurrY -= 0_PrewY // (float)
      
        0604: get_Z_angle_for_point 0_NextX 0_NextY store_to 0_Angle1
        0604: get_Z_angle_for_point 0_CurrX 0_CurrY store_to 0_Angle2
        0063: 0_Angle1 -= 0_Angle2 // (float)
        0656: get_angle 0_Angle1 absolute_degrees_to 0_Angle1
        if and
            0_Angle1 >= 30.0
            0_Angle1 < 180.0
        then
            0_LightsStatus = 1_Left
        else
            if and
                0_Angle1 <= 330.0
                0_Angle1 > 180.0
            then
                0_LightsStatus = 1_Right
            else
                0_LightsStatus = 0
            end
        end   // LightsStatus
         
        // проверяем намерение перестроиться (если водитель едет по шоссе)
        if
            0_LightsStatus == 0
        then
            0A8E: 0_CurrentLane = 0_VehicleStruct + 0x3B7 // int   ТЕКУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
            0A8E: 0_NextLane = 0_VehicleStruct + 0x3B8    // int   БУДУЩАЯ ПОЛОСА ДВИЖЕНИЯ   0 - левая  1 - правая
            0A8D: 0_CurrentLane = read_memory 0_CurrentLane size 1 virtual_protect 0
            0A8D: 0_NextLane = read_memory 0_NextLane size 1 virtual_protect 0
            if and
                0_CurrentLane == 0
                0_NextLane == 1
            then 
                0_LightsStatus = 1_Right
            end
            if and
                0_CurrentLane == 1
                0_NextLane == 0
            then 
                0_LightsStatus = 1_Left
            end
        end 
         
        gosub @Get_lights_coords
        if
            0_LightsStatus == 1_Right
        then
            0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
            0AC7: 0_VectorPointer = var 0_BackLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
        end
        if
            0_LightsStatus == 1_Left
        then
            0_BackLightX *= -1.0
            0_FrontLightX *= -1.0
            0AC7: 0_VectorPointer = var 0_FrontLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
            0AC7: 0_VectorPointer = var 0_BackLightX offset
            0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
            0_UnicalNumberOfCorona += 1
        end       
    end   // FFFF    3A4    
end
 
0_VehicleStruct += 0x4C8
0A8D: 0_VehicleStruct = read_memory 0_VehicleStruct size 4 virtual_protect 0
if
    0_VehicleStruct > 0
then
    gosub @Get_lights_coords
    if or
        0_LightsStatus == 1_Right
        0_LightsStatus == 1_Both
    then
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end
    if or
        0_LightsStatus == 1_Left
        0_LightsStatus == 1_Both
    then
        0_BackLightX *= -1.0
        0AC7: 0_VectorPointer = var 0_BackLightX offset
        0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 50.0 0 penetration 0.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona
        0_UnicalNumberOfCorona += 1
    end   
end
   
return
 
:Get_lights_coords
0A8E: 0_Adress = 0_VehicleStruct + 0x22 // int
0A8D: 0_Adress = read_memory 0_Adress size 2 virtual_protect 0 //model index
0_Adress *= 4
0_Adress += 0xA9B0C8
0A8D: 0_Adress = read_memory 0_Adress size 4 virtual_protect 0 //CModel
0_Adress += 0x5C                                       
0A8D: 0_Adress = read_memory 0_Adress size 4 virtual_protect 0 //vehicle struct
0A8D: 0_FrontLightX = read_memory 0_Adress size 4 virtual_protect 0 //x offset
0_Adress += 4
0A8D: 0_FrontLightY = read_memory 0_Adress size 4 virtual_protect 0 //y offset
0_Adress += 4
0A8D: 0_FrontLightZ = read_memory 0_Adress size 4 virtual_protect 0 //z offset
0_Adress += 4
0A8D: 0_BackLightX = read_memory 0_Adress size 4 virtual_protect 0 //x offset
0_Adress += 4
0A8D: 0_BackLightY = read_memory 0_Adress size 4 virtual_protect 0 //y offset
0_Adress += 4
0A8D: 0_BackLightZ = read_memory 0_Adress size 4 virtual_protect 0 //z offset
if
    0_FrontLightX == 0.0
then
    0_FrontLightX = 0.15
end
if
    0_BackLightX == 0.0
then
    0_BackLightX = 0.15
end
return
 
:SHR_0Ah
hex
    C1 E9 0A          // shr ecx, 0xA
    89 C8             // mov eax, ecx
    C3                // retn
end
 
:AND_3FFh
hex
    81 E1 FF 03 00 00 // and ecx, 0x3FF
    89 C8             // mov eax, ecx
    C3                // retn
end
// 0AA5: 0x6FC580 21 21 1 0 attach_corona_flash_inertia 15.0 0 penetration 1.5 0 0 0 0 0 flare 0 type 0 range_of_visibility 150.0 radius 0.3 with_offsets 0_VectorPointer intensity 255 blue 0 green 128 red 255 to_physical 0_VehicleStruct unical_number 0_UnicalNumberOfCorona

Архив со скомпилированным скриптом приложен к сообщению.

Offline

#61 20-03-2016 14:03

kenking
From: Казахстан
Registered: 28-06-2010
Posts: 253

Re: Универсальные поворотники [CLEO4/SA/REL]

Den_spb wrote:

Немного доработал скрипт.

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

Offline

#62 20-03-2016 14:56

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Да, большой получился перерыв.
Принципиально новых скриптов от меня можно пока не ожидать, но возможно в скором времени появятся обновленные версии некоторых старых модов.

Offline

#63 20-03-2016 23:01

Goldfish
From: Псков
Registered: 21-04-2015
Posts: 177
Website

Re: Универсальные поворотники [CLEO4/SA/REL]

Den_spb, большая просьба)
как узнать правую или левую полосу в офсете от N'ной точки пути или по какой полосе едет авто ГГ ?? smile

Offline

#64 21-03-2016 20:22

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

Re: Универсальные поворотники [CLEO4/SA/REL]

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

Offline

#65 07-05-2016 21:36

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Универсальные поворотники на C++

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
#include <plugin.h>
#include <game_sa\CVehicle.h>
#include <game_sa\common.h>
#include <game_sa\CModelInfo.h>
#include <game_sa\CTimer.h>
#include <game_sa\CCoronas.h>
#include <game_sa\CGeneral.h>
#include <game_sa\CCamera.h>
#include <extender\VehicleExtender.h>
 
// originally made by Den_spb
 
#define TURN_ON_OFF_DELAY 500
#define MAX_RADIUS 200.0f
 
using namespace plugin;
 
class UniversalTurnlights {
public:
    enum eLightsStatus {
        LIGHTS_OFF, LIGHTS_LEFT, LIGHTS_RIGHT, LIGHTS_BOTH
    };
 
    class VehicleTurnlightsData {
    public:
        eLightsStatus lightsStatus;
 
        VehicleTurnlightsData(CVehicle *) {
            lightsStatus = LIGHTS_OFF;
        }
    };
 
    static VehicleExtendedData<VehicleTurnlightsData> *pTurnlightsData;
 
    UniversalTurnlights() {
        pTurnlightsData = new VehicleExtendedData<VehicleTurnlightsData>;
         
        Events::vehicleRenderEvent.before += [](CVehicle *vehicle){
            if ((vehicle->m_dwVehicleSubClass == VEHICLE_AUTOMOBILE || vehicle->m_dwVehicleSubClass == VEHICLE_BIKE) &&
                (vehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_AUTOMOBILE || vehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BIKE) &&
                vehicle->m_wModelIndex != MODEL_BMX && vehicle->m_wModelIndex != MODEL_BIKE && vehicle->m_wModelIndex != MODEL_MTBIKE &&
                !vehicle->m_pAttachedTo)
            {
                eLightsStatus &lightsStatus = pTurnlightsData->Get(vehicle).lightsStatus;
                if (vehicle->m_pDriver) {
                    CPed *playa = FindPlayerPed();
                    if (playa && playa->m_pVehicle == vehicle && playa->m_bInVehicle) {
                        if (KeyPressed(90)) // Z
                            lightsStatus = LIGHTS_LEFT;
                        else if (KeyPressed(88)) // X
                            lightsStatus = LIGHTS_BOTH;
                        else if (KeyPressed(67)) // C
                            lightsStatus = LIGHTS_RIGHT;
                        else if (KeyPressed(VK_SHIFT))
                            lightsStatus = LIGHTS_OFF;
                    }
                    else {
                        lightsStatus = LIGHTS_OFF;
 
                        CVector2D prevPoint = GetCarPathLinkPosition(vehicle->m_autoPilot.m_wPreviousPathNodeInfo);
                        CVector2D currPoint = GetCarPathLinkPosition(vehicle->m_autoPilot.m_wCurrentPathNodeInfo);
                        CVector2D nextPoint = GetCarPathLinkPosition(vehicle->m_autoPilot.m_wNextPathNodeInfo);
 
                        float angle = GetZAngleForPoint(nextPoint - currPoint) - GetZAngleForPoint(currPoint - prevPoint);
                        while (angle < 0.0f) angle += 360.0f;
                        while (angle > 360.0f) angle -= 360.0f;
 
                        if (angle >= 30.0f && angle < 180.0f)
                            lightsStatus = LIGHTS_LEFT;
                        else if (angle <= 330.0f && angle > 180.0f)
                            lightsStatus = LIGHTS_RIGHT;
 
                        if (lightsStatus == LIGHTS_OFF) {
                            if (vehicle->m_autoPilot.m_nCurrentLane == 0 && vehicle->m_autoPilot.m_nNextLane == 1)
                                lightsStatus = LIGHTS_RIGHT;
                            else if (vehicle->m_autoPilot.m_nCurrentLane == 1 && vehicle->m_autoPilot.m_nNextLane == 0)
                                lightsStatus = LIGHTS_LEFT;
                        }
                    }
                }
                if(CTimer::m_snTimeInMilliseconds % (TURN_ON_OFF_DELAY * 2) < TURN_ON_OFF_DELAY) {
                    CVector dv = TheCamera.m_vGameCamPos - vehicle->GetCoords();
                    if (dv.Magnitude() < MAX_RADIUS) {
                        DrawVehicleTurnlights(vehicle, lightsStatus);
                        if (vehicle->m_pTractor)
                            DrawVehicleTurnlights(vehicle->m_pTractor, lightsStatus);
                    }
                }
            }
        };
    }
 
    ~UniversalTurnlights() {
        delete pTurnlightsData;
    }
 
    static CVector2D GetCarPathLinkPosition(CCarPathLinkAddress &address) {
        if (address.m_wAreaId != -1 && address.m_wCarPathLinkId != -1 && ThePaths.m_pPathNodes[address.m_wAreaId]) {
            return CVector2D(static_cast<float>(ThePaths.m_pNaviNodes[address.m_wAreaId][address.m_wCarPathLinkId].m_posn.x) / 8.0f,
                static_cast<float>(ThePaths.m_pNaviNodes[address.m_wAreaId][address.m_wCarPathLinkId].m_posn.y) / 8.0f);
        }
        return CVector2D(0.0f, 0.0f);
    }
 
    static void DrawTurnlight(CVehicle *vehicle, unsigned int dummyId, bool leftSide) {
        CVector posn =
            reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex])->m_pVehicleStruct->m_avDummyPosn[dummyId];
        if (posn.x == 0.0f) posn.x = 0.15f;
        if (leftSide) posn.x *= -1.0f;
        CCoronas::RegisterCorona(reinterpret_cast<unsigned int>(vehicle) + 50 + dummyId + (leftSide? 0 : 2), vehicle, 255, 128, 0, 255, posn,
            0.3f, 150.0f, CORONATYPE_SHINYSTAR, 0, false, false, 0, 0.0f, false, 0.5f, 0, 50.0f, false, true);
    }
 
    static void DrawVehicleTurnlights(CVehicle *vehicle, eLightsStatus lightsStatus) {
        if (lightsStatus == LIGHTS_BOTH || lightsStatus == LIGHTS_RIGHT) {
            DrawTurnlight(vehicle, 0, false);
            DrawTurnlight(vehicle, 1, false);
        }
        if (lightsStatus == LIGHTS_BOTH || lightsStatus == LIGHTS_LEFT) {
            DrawTurnlight(vehicle, 0, true);
            DrawTurnlight(vehicle, 1, true);
        }
    }
 
    static float GetZAngleForPoint(CVector2D &point) {
        float angle = CGeneral::GetATanOfXY(point.x, point.y) * 57.295776f - 90.0f;
        while (angle < 0.0f) angle += 360.0f;
        return angle;
    }
 
    static bool KeyPressed(unsigned int keyCode) {
        return (GetKeyState(keyCode) & 0x8000) != 0;
    }
} plg;
 
VehicleExtendedData<UniversalTurnlights::VehicleTurnlightsData> *UniversalTurnlights::pTurnlightsData;

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


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

Offline

#66 09-05-2016 18:00

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Дима, выкладывай конечно good
Правильно ли я понимаю, что данный файл будет иметь формат asi ?

DK22Pac wrote:

Как дополнительная фича - неограниченное кол-во пустых авто с включенными поворотами.

Речь идёт об автомобилях, в которых сидел игрок? Если да, то где хранится соответствующая информация - в структуре самого авто или в каких-то переменных (из кода не понял) ?

Offline

#67 10-05-2016 19:18

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

Re: Универсальные поворотники [CLEO4/SA/REL]

Den_spb wrote:

Дима, выкладывай конечно good
Правильно ли я понимаю, что данный файл будет иметь формат asi ?

DK22Pac wrote:

Как дополнительная фича - неограниченное кол-во пустых авто с включенными поворотами.

Речь идёт об автомобилях, в которых сидел игрок? Если да, то где хранится соответствующая информация - в структуре самого авто или в каких-то переменных (из кода не понял) ?

1) Выложу весь проект (Visual Studio), вместе со скомпилированной библиотекой (asi).
2) Статус хранится для всех авто. Может быть даже ситуация, когда игрок вытаскивает NPC из авто, а поворотники на авто продолжают работать.
Как это работает: при создании пула CVehicle, выделяется память для хранения дополнительных свойств на каждое авто.
В коде этого явно не видно, всё завернуто в класс-шаблон VehicleExtendedData.

https://github.com/DK22Pac/plugin-sdk/t … Turnlights

Last edited by DK22Pac (21-05-2016 12:28)


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

Offline

Board footer

Powered by FluxBB