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