#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 ). Условие назначения звезды

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

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

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-функции довольно ресурсоемкие, для оптимизации я бы предложил использовать метод, описанный здесь, и заменить вызов и саму функцию на следующий код:

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

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

: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, когда он проезжает на красный туда же, где стоит проверка на кол-во звезд ->

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:

//Проехал на красный - получи звезду 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.Звезда выдаётся только в том случае, если поблизости есть полицейский, который стал свидетелем вашего правонарушения.
Код:

//Проехал на красный - получи звезду 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

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

//Проехал на красный - получи звезду 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