You are not logged in.
Теперь за проезд запрещающего сигнала светофора вы получите 1 звезду интереса полиции (если в момент проезда звёзд у вас не было). " rel="nofollow">http://sannybuilder.com/forums/viewtopic.php?id=679).
Скрипт включается в работу, только если игрок не управляет летательным транспортом, водным транспортом, или поездом (исключение - трамвай).
Если на автомобиле игрока включена сирена (автомашина спецслужб), то при проезде красного сигнала звезда выдаваться не будет.
Для работы скрипта требуется библиотека 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@
Скрины:
Offline
Супер скрипт, все его ждали честно!
Классовый, очень полезный, спасибо тебе Den_spb, RESPECT!!!
Но есть предложения:
Чтоб не заморачиваться на звездах, ставишь просто
010E: set_player $PLAYER_CHAR minimum_wanted_level_to 1.
I know everything and nothing...
Offline
Классный скрипт, давно подобное искал! Спасибо, Den!
Offline
Было бы лучше: если копов по близости нет, звезды тоже нет.
Last edited by GTASA (10-03-2010 12:07)
Offline
Благодарю за отзывы.
Но есть предложения:
Чтоб не заморачиваться на звездах, ставишь просто
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
Скрипт в игре не проверял, но код посмотрел, поскольку сам когда то хотел сделать такой же мод (даже копался в ехе в коде светофоров).
Есть одно замечание. Функция 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
Кстате заметил на CLEO 4 не пашет, при том что я код не менял, а просто добавил плагин из архива.
Добавлено:
Так вру я использовал самую последнюю версию плагина из рук Alien'а
Last edited by mfisto (10-03-2010 21:54)
I know everything and nothing...
Offline
Den_spb помотри вот это.
scm func заменю на gosub, это уже обсудили. Хотя Seemann не говорил, что применение scm func здесь - явная ошибка.
Кстате заметил на CLEO 4 не пашет
Вылетает игра?
Offline
Посмотри внимательнее я не об этом писал.
Добавлено:
Я о том, что, как ты написал внутри функции, там у тебя 19@, а это не верно в CLEO 4 сделано правильно, там те переменные которые не передаются обнуляются, поэтому должно быть 0@.
Last edited by mfisto (13-03-2010 19:53)
I know everything and nothing...
Offline
Рекомедую осуществлять следующую проверку для того, чтоб узнать, увидел ли какой нибудь коп 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
Если поворачиваешь на дороге или едешь по трассе, которая над светофорами, дают звезду. Чо делать?..
Last edited by ~AquaZ~ (17-03-2010 20:52)
Offline
Такое случается в некоторых местах (например, эстакада в Лос Сантосе). Проблему предполагаю решить добавлением проверки "no_obstacles solid 1" (есть ли статические объекты между игроком и светофором).
Offline
Версия 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
Если поворачиваешь на дороге
Независимо от того, движется машина прямо или поворачивает, запрещено пересекать сзади и спереди консольные светофоры двух моделей, которые светят и взад, и вперёд (см. списки моделей светофоров в исходнике скрипта). Такое условие пришлось ввести потому, что в игре эти светофоры устанавливаются на разных перекрёстках по-разному: где-то "лицом" к центру перекрёстка, а где-то "спиной". В данном случае следует остановиться на перекрёстке и дождаться разрешающего сигнала для завершения поворота.
Светофоры других моделей (светящих в одну сторону) всегда устанавливаются задней стороной к центру перекрёстка - с этой стороны их можно пересекать и, следовательно, совершать поворот на перекрёстке.
Offline
Интересно... Как бы ещё ограничить "звездоприсваивание" по Z-координате, чтобы звезду давало только когда я на дороге - неприятно, когда лечу на F22, и получаю звезду. Или еду на Lamborghini по туннелю для поезов - вдруг звезда.
Offline
когда лечу на F22, и получаю звезду.
и в первой, и во второй версии есть проверки типа транспорта, которым управляет игрок. Если это воздушный, водный или ж/д транспорт (кроме трамвая), то скрипт работать не будет.
Или еду на Lamborghini по туннелю для поезов
Во второй версии для подобных случаев добавлена проверка: есть ли статические объекты между игроком и светофором. Если проверка подтверждается, то светофор "снимается с учёта". Также во второй версии уменьшен радиус поиска светофоров - 30 м.
Last edited by Den_spb (10-04-2010 11:43)
Offline
получи звезду? хм. В игре есть такая штука, как wanted pool. На основе её рассчитывается wanted level. Если поблизости нет копов и ты не в самолёте и не на копотранспорте, пул уменьшается каждую секунду на 2. Можно вместо звезды увеличивать пул на 20, скажем, до достижения 180 (50+ - 1 звезда, 180+ - 2 звезды)
Offline
Можно, конечно, сделать и так. Но, во-первых, основная задача скрипта состоит именно в фиксации проезда запрещающего сигнала. Наказание в этом случае несложно подобрать самостоятельно. Во-вторых, одна звезда - и так слишком незначительный уровень интереса полиции. Если ехать на значительной скорости, то звезда довольно быстро пропадает.
Offline
Ну да, суть в общем понятна
Если ехать на значительной скорости, то звезда довольно быстро пропадает.
По моим наблюдениям за этим самым wanted pool-ом, звёзды снимаются если:
1) игрок не рядом с милиционерами
2) игрок не на копомобиле
3) Игрок не на самолёте
как-то так
Offline
Версия 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
При заходе в машину вылет моментальный. Видел версию скрипта, которая более ресурсоемка, но не вылетает. Где её можно найти? Заранее спасибо;)
Эпитафия на могиле фидошника: "Меня видно?"
Offline