You are not logged in.
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 ). Условие назначения звезды
1 2 3 4 5 | if 810F: not player $PLAYER_CHAR wanted_level > 0 then 010D: set_player $PLAYER_CHAR wanted_level_to 1 end |
можно переделать следующим образом:
1 2 3 4 5 6 7 | 080E: store_actor $PLAYER_ACTOR present_ped_event_to 31@ if and 31@ == 72 810F: not player $PLAYER_CHAR wanted_level > 0 then 010D: set_player $PLAYER_CHAR wanted_level_to 1 end |
Offline
Скрипт в игре не проверял, но код посмотрел, поскольку сам когда то хотел сделать такой же мод (даже копался в ехе в коде светофоров).
Есть одно замечание. Функция is_Object_Traffic_Light в данном скрипте избыточна, поскольку это по сути расширенная проверка. Поскольку scm-функции довольно ресурсоемкие, для оптимизации я бы предложил использовать метод, описанный здесь, и заменить вызов и саму функцию на следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | if gosub @is_Object_Traffic_Light then ... :is_Object_Traffic_Light if or 19@ == 3855 // GAY_TRAFFIC_LIGHT 19@ == 1315 // TRAFFICLIGHT1 19@ == 1352 // CJ_TRAFFIC_LIGHT3 19@ == 1350 // CJ_TRAFFIC_LIGHT4 19@ == 1351 // CJ_TRAFFIC_LIGHT5 19@ == 3516 // VGSSTRIPTLIGHTS1 19@ == 1283 // MTRAFFIC1 then 0485: return_true else if 19@ == 1284 // MTRAFFIC2 then 0485: return_true end 059A: return_false end return |
При этом теоретически функцию можно свернуть до след кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | :is_Object_Traffic_Light if or 19@ == 3855 // GAY_TRAFFIC_LIGHT 19@ == 1315 // TRAFFICLIGHT1 19@ == 1352 // CJ_TRAFFIC_LIGHT3 19@ == 1350 // CJ_TRAFFIC_LIGHT4 19@ == 1351 // CJ_TRAFFIC_LIGHT5 19@ == 3516 // VGSSTRIPTLIGHTS1 19@ == 1283 // MTRAFFIC1 then else 19@ == 1284 // MTRAFFIC2 end return |
Offline
Кстате заметил на 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, когда он проезжает на красный туда же, где стоит проверка на кол-во звезд ->
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | if 0AB1: call_scm_func @GetCopSpotYou 0 ... :GETCOPSPOTYOU Actor.StorePos( $PLAYER_ACTOR , 0@ , 1@ , 2@ ) 0006: 16@ = 305868 0006: 6@ = 1988 :ACTOR_STARTSEARCH 008B: 16@ = &0( 16@ ,1i) // CPool* 0AB1: call_scm_func @ACTOR_READMEMOFFSET 2 ( 16@ + 8 )^ = 7@ // CPool.Size 0A8D: 11@ = read_memory 16@ size 4 virtual_protect 0 // CPool.pUnits 0006: 10@ = 0 :ACTOR_SEARCHLOOPMAIN 0AB1: call_scm_func @ACTOR_READMEMOFFSET 2 ( 11@ + 20 )^ = 4@ // xyz* 8039: not 4@ == 0 004D: jump_if_false @ACTOR_SEARCHLOOPNEXT 0085: 9@ = 10@ // (int) // counter 0AB1: call_scm_func @ACTOR_READMEMOFFSET 2 ( 16@ + 4 )^ = 4@ // CPool.flags 005A: 4@ += 9@ // (int) 0A8D: 4@ = read_memory 4@ size 1 virtual_protect 0 0012: 9@ *= 256 005A: 9@ += 4@ // (int) :ACTOR_TESTACTORHANDLE 056D: is 9@ valid_actor_handle 004D: jump_if_false @ACTOR_NOHANDLE 00D6: if and 803C: not $PLAYER_ACTOR == 9@ // (int) 8118: not actor 9@ dead 004D: jump_if_false @ACTOR_NOHANDLE 089F: get_actor 9@ pedtype_to 17@ 17@ == 6 004D: jump_if_false @ACTOR_NOHANDLE 8364: not actor 9@ spotted_actor $PLAYER_ACTOR 004D: jump_if_false @ACTOR_NEWSEARCHRADIUS :ACTOR_NOHANDLE 0002: jump @ACTOR_SEARCHLOOPNEXT :ACTOR_NEWSEARCHRADIUS 0485: return_true jump @ACTOR_SEARCHFINISH :ACTOR_SEARCHLOOPNEXT 005A: 11@ += 6@ // (int) 000A: 10@ += 1 002D: 10@ >= 7@ // (int) 004D: jump_if_false @ACTOR_SEARCHLOOPMAIN 059A: return_false :ACTOR_SEARCHFINISH 0AB2: ret 0 :ACTOR_READMEMOFFSET 0A8E: 0@ = 0@ + 1@ // int 0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0 0AB2: ret 1 0@ |
Просто я заметил как и многие надеюсь, путем event выловить в нужный момент нужный не всегда удается, поэтому я применил бы вот этот способ к этому скрипту.
I know everything and nothing...
Offline
Если поворачиваешь на дороге или едешь по трассе, которая над светофорами, дают звезду. Чо делать?..
Last edited by ~AquaZ~ (17-03-2010 20:52)
Offline
Такое случается в некоторых местах (например, эстакада в Лос Сантосе). Проблему предполагаю решить добавлением проверки "no_obstacles solid 1" (есть ли статические объекты между игроком и светофором).
Offline
Версия 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 | //Проехал на красный - получи звезду 2 (клео-скрипт для гта са) { $CLEO } var 17@ : Integer 18@ : Integer 6@ : Integer 8@ : Integer 29@ : Integer 30@ : Integer 25@ : Integer end const Player_WAS_in_front_of_red_traffic_light = 17@ Traffic_light_type = 18@ // 1 or 2 Type_of_red_traffic_light = 6@ // 0,1,2,3 0 - both not red 3 - both red Player_IS_in_front_of_red_traffic_light = 8@ Traffic_light_model = 25@ end 19@ = 30000.0 20@ = 30000.0 //---------------------------------------------------------------------------------------------------- while true wait 0 if player.Defined( $PLAYER_CHAR ) then if and actor.Driving( $PLAYER_ACTOR ) 84A7: not actor $PLAYER_ACTOR driving_boat 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle then if or 89AE: not actor $PLAYER_ACTOR driving_train actor.DrivingVehicleType( $PLAYER_ACTOR 449) then 03C0: 28@ = actor $PLAYER_ACTOR car if 8ABD: not vehicle 28@ siren_on then //--------------------------------------------------------------------------Определяем ближайший светофор actor.StorePos( $PLAYER_ACTOR 0@ 1@ 2@ ) 3@ = 30.0 // gosub @AIC_GETOBJECT 0B13: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1 // 60.0 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ if 03CA: object 9@ exists then 0984: 31@ = object 9@ model gosub @is_Object_Traffic_Light if 31@ <> 0 then object.StorePos( 9@ 12@ 13@ 26@ ) actor.StorePos( $player_actor 0@ 1@ 2@ ) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0509: 2@ = distance_between_XY 0@ 1@ and_XY 12@ 13@ if 0025: 14@ > 2@ // (float) then 23@ = 0 0085: Traffic_light_model = 31@ // (int) 0087: 19@ = 12@ // (float) 0087: 20@ = 13@ // (float) 0087: 27@ = 26@ // (float) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0176: 24@ = object 9@ Z_angle 02F6: 10@ = cosine 24@ // (float) синус 02F7: 22@ = sine 24@ // (float) косинус 0073: 10@ /= 22@ // (float) тангенс //----------------------------------Определяем тип светофора if and 24@ >= 60.0 24@ <= 150.0 then Traffic_light_type = 2 else if and 24@ >= 240.0 24@ <= 330.0 then Traffic_light_type = 2 else Traffic_light_type = 1 end end end end end actor.StorePos( $player_actor 0@ 1@ 2@ ) 27@ += 1.0 if and 14@ < 30.0 // если ближайший светофор достаточно близко 06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0 // и нет препятствий между светофором и игроком then // иначе интереса светофор не представляют 27@ -= 1.0 else 27@ -= 1.0 23@ = 0 continue end //------------------------Определяем позицию игрока относительно светофора 0087: 22@ = 0@ // (float) 0063: 22@ -= 19@ // (float) 006B: 22@ *= 10@ // (float) 005B: 22@ += 20@ // (float) if or 24@ < 90.0 24@ > 270.0 then if 0025: 22@ > 1@ // (float) Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 90.0 then if 0025: 0@ > 19@ // (float) X_act > X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 270.0 then if 0025: 19@ > 0@ // (float) X_act < X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else // Z > 90 AND Z < 270 if 0025: 1@ > 22@ // (float) Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end end end end //------------------------------------------------------------------------ if 23@ == 0 then if or // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале) Traffic_light_model == 3855 Traffic_light_model == 1315 Traffic_light_model == 1352 Traffic_light_model == 1350 Traffic_light_model == 1351 Traffic_light_model == 3516 then if Player_IS_in_front_of_red_traffic_light == True then 23@ = 1 end else if or // Список светофоров, запрещённых к пересечению и спереди, и сзади Traffic_light_model == 1283 Traffic_light_model == 1284 then 23@ = 1 end end else if 23@ == 2 then if Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light then 23@ = 3 end end end Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light //---------------------------Определяем текущие цвета светофоров типов 1 и 2 0AA7: call_function 0x49d 310 num_params 0 pop 0 29@ // _?TimeToSwitchTrafficLightToRed 0AA7: call_function 0x49d 350 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.Звезда выдаётся только в том случае, если поблизости есть полицейский, который стал свидетелем вашего правонарушения.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 | //Проехал на красный - получи звезду 3 (клео-скрипт для гта са) { $CLEO } var 17@ : Integer 18@ : Integer 6@ : Integer 8@ : Integer 29@ : Integer 30@ : Integer 25@ : Integer end const Player_WAS_in_front_of_red_traffic_light = 17@ Traffic_light_type = 18@ // 1 or 2 Type_of_red_traffic_light = 6@ // 0,1,2,3 0 - both not red 3 - both red Player_IS_in_front_of_red_traffic_light = 8@ Traffic_light_model = 25@ end 19@ = 30000.0 20@ = 30000.0 //---------------------------------------------------------------------------------------------------- while true wait 0 if player.Defined( $PLAYER_CHAR ) then if and actor.Driving( $PLAYER_ACTOR ) 84A7: not actor $PLAYER_ACTOR driving_boat 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle then if or 89AE: not actor $PLAYER_ACTOR driving_train actor.DrivingVehicleType( $PLAYER_ACTOR , #TRAM ) then 03C0: 28@ = actor $PLAYER_ACTOR car if 8ABD: not vehicle 28@ siren_on then //--------------------------------------------------------------------------Определяем ближайший светофор actor.StorePos( $PLAYER_ACTOR 0@ 1@ 2@ ) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ if gosub @GET_RANDOM_OBJECT then 23@ = 0 0085: Traffic_light_model = 31@ // (int) 0087: 19@ = 12@ // (float) 0087: 20@ = 13@ // (float) 0087: 27@ = 26@ // (float) 27@ += 1.0 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0176: 24@ = object 9@ Z_angle 02F6: 10@ = cosine 24@ // (float) синус 02F7: 22@ = sine 24@ // (float) косинус 0073: 10@ /= 22@ // (float) тангенс //----------------------------------Определяем тип светофора if and 24@ >= 60.0 24@ <= 150.0 then Traffic_light_type = 2 else if and 24@ >= 240.0 24@ <= 330.0 then Traffic_light_type = 2 else Traffic_light_type = 1 end end end //-----------------------------------------------------------------Производим проверки от незаслуженных звезд actor.StorePos( $player_actor 0@ 1@ 2@ ) if and 14@ < 30.0 // если ближайший светофор достаточно близко 06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0 // и нет препятствий между светофором и игроком then // иначе интереса светофор не представляют else 23@ = 0 continue end //------------------------Определяем позицию игрока относительно светофора 0087: 22@ = 0@ // (float) 0063: 22@ -= 19@ // (float) 006B: 22@ *= 10@ // (float) 005B: 22@ += 20@ // (float) if or 24@ < 90.0 24@ > 270.0 then if 0025: 22@ > 1@ // (float) Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 90.0 then if 0025: 0@ > 19@ // (float) X_act > X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 270.0 then if 0025: 19@ > 0@ // (float) X_act < X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else // Z > 90 AND Z < 270 if 0025: 1@ > 22@ // (float) Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end end end end //------------------------------------------------------------------------ if 23@ == 0 then if or // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале) Traffic_light_model == 3855 Traffic_light_model == 1315 Traffic_light_model == 1352 Traffic_light_model == 1350 Traffic_light_model == 1351 Traffic_light_model == 3516 then if Player_IS_in_front_of_red_traffic_light == True then 23@ = 1 end else if or // Список светофоров, запрещённых к пересечению и спереди, и сзади Traffic_light_model == 1283 Traffic_light_model == 1284 then 23@ = 1 end end else if 23@ == 2 then if Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light then 23@ = 3 end end end Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light //---------------------------Определяем текущие цвета светофоров типов 1 и 2 0AA7: call_function 0x49D3A 0 num_params 0 pop 0 29@ // Направление 2 (запад-восток) 0AA7: call_function 0x49D 350 num_params 0 pop 0 30@ // Направление 1 (север-юг) for 16@ = 8 to 31 08C3: clear 29@ bit 16@ 08C3: clear 30@ bit 16@ end // значения функций: 0 - зелёный, 1 - желтый, 2 - красный if 30@ == 2 then if 29@ == 2 then Type_of_red_traffic_light = 3 // both are red else Type_of_red_traffic_light = 1 end else if 29@ == 2 then Type_of_red_traffic_light = 2 else Type_of_red_traffic_light = 0 end end //-------------------------------------------------------------------------- if or Type_of_red_traffic_light == 3 Type_of_red_traffic_light == Traffic_light_type then if 23@ == 1 then 23@ = 2 else if 23@ == 3 then if player.Defined( $PLAYER_CHAR ) then if 810F: not player $PLAYER_CHAR wanted_level > 0 then if gosub @CHECK_ANY_COP_NEAR_PLAYER then 010D: set_player $PLAYER_CHAR wanted_level_to 1 end end end 23@ = 0 end end else 23@ = 0 end // type == type else 23@ = 0 end // siren on else 23@ = 0 end else 23@ = 0 end else 23@ = 0 end // player defined end // while main //----------------------------------------------------------------------------------------- :GET_RANDOM_OBJECT if 0AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 0 then repeat 0984: 31@ = object 9@ model if and 31@ <> 3855 // GAY_TRAFFIC_LIGHT + 31@ <> 1315 // TRAFFICLIGHT1 + 31@ <> 1352 // CJ_TRAFFIC_LIGHT3 + 31@ <> 1350 // CJ_TRAFFIC_LIGHT4 + 31@ <> 1351 // CJ_TRAFFIC_LIGHT5 + 31@ <> 3516 // VGSSTRIPTLIGHTS1 + 31@ <> 1283 // MTRAFFIC1 + then if 31@ <> 1284 // MTRAFFIC2 + then 31@ = 0 end end if 31@ <> 0 then object.StorePos( 9@ 12@ 13@ 26@ ) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0509: 3@ = distance_between_XY 0@ 1@ and_XY 12@ 13@ if 0025: 14@ > 3@ // (float) then 0485: return_true return end end until 8AE3: 9@ = random_object_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1 end 8485: return_false return :CHECK_ANY_COP_NEAR_PLAYER if 0AE1: 21@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 0 pass_deads 1 //IF and SET then repeat 089F: get_actor 21@ pedtype_to 16@ if and 16@ == 6 0364: actor 21@ spotted_actor $PLAYER_ACTOR then 0485: return_true return end until 8AE1: not 21@ = random_actor_near_point 0@ 1@ 2@ in_radius 50.0 find_next 1 pass_deads 1 //IF and SET end 8485: return_false return |
Есть и другая, визуальная версия скрипта, которая демонстрирует, как работает мод (ей я пользовался на этапе тестирования):
-рядом с ближайшим светофором создаётся источник света, с таким же цветом, что и светофор.
-на экран выводится информация о том, спереди или позади ближайшего светофора находится игрок
-над полицейским, заметившим проезд светофора, создаётся маркер.
Код визуальной версии:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 | //Проехал на красный - получи звезду 3 (клео-скрипт для гта са) { $CLEO } var 17@ : Integer 18@ : Integer 6@ : Integer 8@ : Integer 29@ : Integer 30@ : Integer 25@ : Integer end const Player_WAS_in_front_of_red_traffic_light = 17@ Traffic_light_type = 18@ // 1 or 2 Type_of_red_traffic_light = 6@ // 0,1,2,3 0 - both not red 3 - both red Player_IS_in_front_of_red_traffic_light = 8@ Traffic_light_model = 25@ end 19@ = 30000.0 20@ = 30000.0 //---------------------------------------------------------------------------------------------------- while true wait 0 if player.Defined( $PLAYER_CHAR ) then if and actor.Driving( $PLAYER_ACTOR ) 84A7: not actor $PLAYER_ACTOR driving_boat 84C8: not actor $PLAYER_ACTOR driving_flying_vehicle then if or 89AE: not actor $PLAYER_ACTOR driving_train actor.DrivingVehicleType( $PLAYER_ACTOR , #TRAM ) then 03C0: 28@ = actor $PLAYER_ACTOR car if 8ABD: not vehicle 28@ siren_on then //--------------------------------------------------------------------------Определяем ближайший светофор actor.StorePos( $PLAYER_ACTOR 0@ 1@ 2@ ) 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ if gosub @GET_RANDOM_OBJECT then 23@ = 0 0085: Traffic_light_model = 31@ // (int) 0087: 19@ = 12@ // (float) 0087: 20@ = 13@ // (float) 0087: 27@ = 26@ // (float) 27@ += 1.0 0509: 14@ = distance_between_XY 0@ 1@ and_XY 19@ 20@ 0176: 24@ = object 9@ Z_angle 02F6: 10@ = cosine 24@ // (float) синус 02F7: 22@ = sine 24@ // (float) косинус 0073: 10@ /= 22@ // (float) тангенс //----------------------------------Определяем тип светофора if and 24@ >= 60.0 24@ <= 150.0 then Traffic_light_type = 2 else if and 24@ >= 240.0 24@ <= 330.0 then Traffic_light_type = 2 else Traffic_light_type = 1 end end end //-----------------------------------------------------------------Производим проверки от незаслуженных звезд actor.StorePos( $player_actor 0@ 1@ 2@ ) if and 14@ < 30.0 // если ближайший светофор достаточно близко 06BD: no_obstacles_between 0@ 1@ 2@ and 19@ 20@ 27@ solid 1 car 0 actor 0 object 0 particle 0 // и нет препятствий между светофором и игроком then // иначе интереса светофор не представляют else 23@ = 0 continue end //------------------------Определяем позицию игрока относительно светофора 0087: 22@ = 0@ // (float) 0063: 22@ -= 19@ // (float) 006B: 22@ *= 10@ // (float) 005B: 22@ += 20@ // (float) if or 24@ < 90.0 24@ > 270.0 then if 0025: 22@ > 1@ // (float) Y_act < tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 90.0 then if 0025: 0@ > 19@ // (float) X_act > X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else if 24@ == 270.0 then if 0025: 19@ > 0@ // (float) X_act < X_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end else // Z > 90 AND Z < 270 if 0025: 1@ > 22@ // (float) Y_act > tg_Z_tl*(X_act-X_tl)+Y_tl then Player_IS_in_front_of_red_traffic_light = True else Player_IS_in_front_of_red_traffic_light = False end end end end //------------------------------------------------------------------------ if 23@ == 0 then if or // Список светофоров, запрещённых к пересечению только спереди (при красном сигнале) Traffic_light_model == 3855 Traffic_light_model == 1315 Traffic_light_model == 1352 Traffic_light_model == 1350 Traffic_light_model == 1351 Traffic_light_model == 3516 then if Player_IS_in_front_of_red_traffic_light == True then 23@ = 1 end else if or // Список светофоров, запрещённых к пересечению и спереди, и сзади Traffic_light_model == 1283 Traffic_light_model == 1284 then 23@ = 1 end end else if 23@ == 2 then if Player_IS_in_front_of_red_traffic_light <> Player_WAS_in_front_of_red_traffic_light then 23@ = 3 end end end Player_WAS_in_front_of_red_traffic_light = Player_IS_in_front_of_red_traffic_light //---------------------------Определяем текущие цвета светофоров типов 1 и 2 0AA7: call_function 0x49D3A 0 num_params 0 pop 0 29@ // Направление 2 (запад-восток) 0AA7: call_function 0x49D 350 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