You are not logged in.
Описание:
Скрипт улучшает движение трамваев в игре, делая его более реалистичным и безопасным:
- Трамвай останавливается, если перед ним имеется препятствие (пешеход, транспортное средство).
- Трамвай останавливается на запрещающий сигнал светофора попутного направления
(в том числе и на выходе с перекрёстка, что является минусом).
- Трамвай останавливается на остановках, обозначенных специальным знаком.
Иногда на остановках в трамвай будут заходить пассажиры (или выходить из него).
- В трамваях появляются водители.
- Игрок может войти в трамвай как водитель (кнопка "[" ) или как пассажир (кнопка "]").
Перед нажатием кнопок надо подойти к трамваю. Стоимость проезда игрока пассажиром - 5$.
- На карте трамвай будет обозначен синим маркером.
Установка:
1.Скачать и установить библиотеку КЛЕО 4 с сайта http://cleo.sannybuilder.com/
2.Поместить файл clever_trams.cs в папку cleo.
Примечания:
1.Во время миссии скрипт работать не будет.
2.Скрипт ищет трамвай по номеру модели (ID 449).
Код (готовый скрипт прикреплён к сообщению):
{$CLEO} // Improvement of trams traffic (by Den_spb)
var
0@: Integer
1@: Integer
// 2-14 переменные для одноразовых значений
15@: Integer
16@: Integer
17@: Integer
18@: Float
19@: Float
20@: Integer
21@: Float
22@: Integer
23@: Integer
end
const
TRAM = 0@
TRAM_STRUCT = 1@
FLAGS = 15@
PASSENGER_0 = 16@
PASSENGER_1 = 17@
LAST_0BJECT_X = 18@
LAST_0BJECT_Y = 19@
0BJECT = 20@
Y_DIMENSION = 21@
MAR_KER = 22@
STOPS_C0UNT = 23@
// BIT FLAGS:
MANY_CARRIAGES = 0
AUTODRIVE_OFF = 1
TRAM_IS_STOPPING = 2
CJ_IS_PASSENGER = 3
end
TRAM = -1
0A8C: write_memory 0x6F7863 size 2 value 0 virtual_protect 1 // при создании трамваев создавать и водителей для них
LAST_0BJECT_X = 50000.0
LAST_0BJECT_Y = 50000.0
while true
wait 0
if or
not player.Defined($PLAYER_CHAR)
$ONMISSION <> 0
then
continue
end
if
856E: not car TRAM defined
then
if
8154: not actor $PLAYER_ACTOR in_zone 'SF' // San Fierro
then
continue
end
if
gosub @SEARCH_TRAM
then
marker.CreateAboveCar(MAR_KER TRAM)
07E0: set_marker MAR_KER type_to 1
018B: set_marker MAR_KER radar_mode 2
FLAGS = 0
0A97: TRAM_STRUCT = car TRAM struct
TRAM_STRUCT += 0x5D4
0A8D: TRAM_STRUCT = read_memory TRAM_STRUCT size 4 virtual_protect 0
07E4: get_model 449 dimensions_cornerA_to 2@ 3@ 4@ dimensions_cornerB_to 5@ Y_DIMENSION 7@
if
TRAM_STRUCT > 0
then
Y_DIMENSION += 16.0
08BD: set FLAGS bit MANY_CARRIAGES
else
Y_DIMENSION += 12.0
end
0209: 8@ = random_int_in_ranges 0 2
if
8@ == 0
then
0561: PASSENGER_0 = create_passenger_in_car TRAM seat 0
actor.RemoveReferences(PASSENGER_0)
else
0561: PASSENGER_1 = create_passenger_in_car TRAM seat 1
actor.RemoveReferences(PASSENGER_1)
end
end
else // tram defined
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 2@ closest_ped_to 3@
if and // посадка игрока в трамвай в качестве водителя или пассажира при нажатии клавиш
003B: 2@ == TRAM // (int)
$ONMISSION == 0
not actor.Driving($PLAYER_ACTOR)
then
if
0AB0: key_pressed 219 // [
then
05CB: AS_actor $PLAYER_ACTOR enter_car TRAM as_driver -1 ms
else
if
0AB0: key_pressed 221 // ]
then
if
0431: car TRAM passenger_seat_free 0
then
05CA: AS_actor $PLAYER_ACTOR enter_car TRAM passenger_seat 0 -1 ms
else
if
0431: car TRAM passenger_seat_free 1
then
05CA: AS_actor $PLAYER_ACTOR enter_car TRAM passenger_seat 1 -1 ms
end
end
end
end
end // cj entering tram
046C: 2@ = car TRAM driver
if
856D: not actor 2@ defined
then
08BD: set FLAGS bit AUTODRIVE_OFF
06DD: set_train TRAM speed 0.0
end
if // выполнение действий при произведённой посадке игрока в трамвай
actor.InCar($PLAYER_ACTOR TRAM)
then
if
003C: $PLAYER_ACTOR == 2@ // (int)
then
08BD: set FLAGS bit AUTODRIVE_OFF
06DD: set_train TRAM speed 0.0
else
if
88B7: not test FLAGS bit CJ_IS_PASSENGER
then
08BD: set FLAGS bit CJ_IS_PASSENGER
0109: player $PLAYER_CHAR money += -5
end
end
else
08C3: clear FLAGS bit CJ_IS_PASSENGER
end // cj not in tram
if
88B7: not test FLAGS bit AUTODRIVE_OFF // автоведение включено
then
if
88B7: not test FLAGS bit TRAM_IS_STOPPING // если не включён процесс остановки перед знаком остановки
then
if
gosub @CHECK_OBSTACLES
then
06DD: set_train TRAM speed 0.0
{ Car.StorePos(TRAM 2@ 3@ 10@) ///////////////////////////////////////////////////////////////////////////////////////////
10@ += 3.0
024F: create_corona_with_radius 1.0 type 2 lensflares 0 with_color 255 255 0 at 2@ 3@ 10@ ///////////////////// }
else
Car.StorePos(TRAM 2@ 3@ 10@)
0407: store_coords_to 5@ 6@ 4@ from_car TRAM with_offset 0.0 -1.0 0.0
0407: store_coords_to 7@ 8@ 4@ from_car TRAM with_offset 0.0 1.0 0.0
0509: 4@ = distance_between_XY LAST_0BJECT_X LAST_0BJECT_Y and_XY 5@ 6@
0509: 9@ = distance_between_XY LAST_0BJECT_X LAST_0BJECT_Y and_XY 7@ 8@
if
0025: 9@ > 4@ // (float)
then
0407: store_coords_to LAST_0BJECT_X LAST_0BJECT_Y 4@ from_car TRAM with_offset 0.0 -50000.0 0.0
end
if
gosub @SEARCH_OBJECTS
then
object.StorePos(0BJECT LAST_0BJECT_X LAST_0BJECT_Y 12@)
06DD: set_train TRAM speed 0.0
{ 12@ += 2.0 ///////////////////////////////////////////////////////////////////////////////////////////////////////////
024F: create_corona_with_radius 1.0 type 2 lensflares 0 with_color 0 0 255 at LAST_0BJECT_X LAST_0BJECT_Y 12@ /////// }
else
06DD: set_train TRAM speed 11.11
end
end
else
if
01C1: car TRAM stopped
then
if
32@ < -5000
then
32@ = -5000
if and
0431: car TRAM passenger_seat_free 0
0431: car TRAM passenger_seat_free 1
then
car.StorePos(TRAM 2@ 3@ 4@)
if
gosub @SEARCH_PASSENGERS
then
0209: 8@ = random_int_in_ranges 0 2
if
8@ == 0
then
05CA: AS_actor 5@ enter_car TRAM passenger_seat 0 -1 ms
else
05CA: AS_actor 5@ enter_car TRAM passenger_seat 1 -1 ms
end
end
else
if
STOPS_C0UNT >= 2
then
0432: PASSENGER_0 = get_actor_handle_from_car TRAM passenger_seat 0
if and
056D: actor PASSENGER_0 defined
803C: not $PLAYER_ACTOR == PASSENGER_0 // (int)
then
0633: AS_actor PASSENGER_0 exit_car
else
0432: PASSENGER_1 = get_actor_handle_from_car TRAM passenger_seat 1
if and
056D: actor PASSENGER_1 defined
803C: not $PLAYER_ACTOR == PASSENGER_1 // (int)
then
0633: AS_actor PASSENGER_1 exit_car
end
end
STOPS_C0UNT = 0
else
STOPS_C0UNT += 1
end
end
else
if
32@ >= 0
then
08C3: clear FLAGS bit TRAM_IS_STOPPING
06DD: set_train TRAM speed 11.11
end
end
end
end // tram is stopping
end // cj is not driver
end // tram defined
end
:SEARCH_TRAM // ищем трамвай
if
0AE2: TRAM = random_vehicle_near_point 0.0 0.0 0.0 in_radius 6000.0 find_next 0 pass_wrecked 1 //IF and SET
then
repeat
if
0137: car TRAM model == 449
then
0A97: TRAM_STRUCT = car TRAM struct
TRAM_STRUCT += 0x5D0
0A8D: TRAM_STRUCT = read_memory TRAM_STRUCT size 4 virtual_protect 0
if
TRAM_STRUCT == 0 // предыдущий вагон отсутствует (данный вагон является нулевым)
then
0485: return_true
return
end
end
until 8AE2: not TRAM = random_vehicle_near_point 0.0 0.0 0.0 in_radius 6000.0 find_next 1 pass_wrecked 1 //IF and SET
end
TRAM = -1
8485: return_false
return
:CHECK_OBSTACLES // ищем препятствия перед трамваем
07E4: get_model 449 dimensions_cornerA_to 2@ 3@ 4@ dimensions_cornerB_to 5@ 8@ 7@
2@ -= 0.1
5@ += 0.1
repeat
0407: store_coords_to 9@ 10@ 11@ from_car TRAM with_offset 2@ 0.0 4@ //1
0407: store_coords_to 12@ 13@ 14@ from_car TRAM with_offset 2@ Y_DIMENSION 4@
if
86BD: not no_obstacles_between 9@ 10@ 11@ and 12@ 13@ 14@ solid 0 car 1 actor 1 object 0 particle 0
then
0485: return_true
return
end
0407: store_coords_to 9@ 10@ 11@ from_car TRAM with_offset 2@ Y_DIMENSION 4@ //2
0407: store_coords_to 12@ 13@ 14@ from_car TRAM with_offset 5@ Y_DIMENSION 4@
if
86BD: not no_obstacles_between 9@ 10@ 11@ and 12@ 13@ 14@ solid 0 car 1 actor 1 object 0 particle 0
then
0485: return_true
return
end
0407: store_coords_to 9@ 10@ 11@ from_car TRAM with_offset 5@ 0.0 4@ //3
0407: store_coords_to 12@ 13@ 14@ from_car TRAM with_offset 5@ Y_DIMENSION 4@
if
86BD: not no_obstacles_between 9@ 10@ 11@ and 12@ 13@ 14@ solid 0 car 1 actor 1 object 0 particle 0
then
0485: return_true
return
end
0407: store_coords_to 9@ 10@ 11@ from_car TRAM with_offset 2@ 8@ 4@ //6
0407: store_coords_to 12@ 13@ 14@ from_car TRAM with_offset 5@ 8@ 4@
if
86BD: not no_obstacles_between 9@ 10@ 11@ and 12@ 13@ 14@ solid 0 car 1 actor 1 object 0 particle 0
then
0485: return_true
return
end
0087: 3@ = 2@ // (float)
repeat
0407: store_coords_to 9@ 10@ 11@ from_car TRAM with_offset 3@ 8@ 4@ //поперечн.
0407: store_coords_to 12@ 13@ 14@ from_car TRAM with_offset 3@ Y_DIMENSION 4@
if
86BD: not no_obstacles_between 9@ 10@ 11@ and 12@ 13@ 14@ solid 0 car 1 actor 1 object 0 particle 0
then
0485: return_true
return
end
3@ += 0.4 // старое значение 0.2
until 0025: 3@ > 5@ // (float)
4@ += 1.0 // старое значение 0.5
until 0025: 4@ > 7@ // (float)
8485: return_false
return
:SEARCH_PASSENGERS // ищем пассажиров, желающих прокатиться на трамвае
if
0AE1: 5@ = random_actor_near_point 2@ 3@ 4@ in_radius 20.0 find_next 0 pass_deads 1 //IF and SET
then
repeat
089F: get_actor 5@ pedtype_to 6@
if or
6@ == 4
6@ == 5
then
080E: get_actor 5@ ped_event_to 6@
if and
6@ == 13
803B: not 5@ == $PLAYER_ACTOR // (int)
then
0485: return_true
return
end
end
until 8AE1: not 5@ = random_actor_near_point 2@ 3@ 4@ in_radius 20.0 find_next 1 pass_deads 1 //IF and SET
end
8485: return_false
return
:SEARCH_OBJECTS // ищем попутный светофор с запрещающим сигналом или знак трамвайной остановки
if
0AE3: 0BJECT = random_object_near_point 2@ 3@ 10@ in_radius Y_DIMENSION find_next 0
then
repeat
if and // проверяем модель объекта
89CC: not object 0BJECT model_is 3855 // GAY_TRAFFIC_LIGHT +
89CC: not object 0BJECT model_is 1315 // TRAFFICLIGHT1 +
89CC: not object 0BJECT model_is 1352 // CJ_TRAFFIC_LIGHT3 +
89CC: not object 0BJECT model_is 1350 // CJ_TRAFFIC_LIGHT4 +
89CC: not object 0BJECT model_is 1351 // CJ_TRAFFIC_LIGHT5 +
89CC: not object 0BJECT model_is 3516 // VGSSTRIPTLIGHTS1 +
89CC: not object 0BJECT model_is 1283 // MTRAFFIC1 +
then
if and
89CC: not object 0BJECT model_is 1284 // MTRAFFIC2 +
89CC: not object 0BJECT model_is 1375 // TRAMSTOP_SF +
then
continue
end
end
object.StorePos(0BJECT 4@ 9@ 12@)
12@ += 1.0
0509: 14@ = distance_between_XY 2@ 3@ and_XY 4@ 9@
0509: 13@ = distance_between_XY 2@ 3@ and_XY LAST_0BJECT_X LAST_0BJECT_Y
if or // находится ли новый объект ближе к трамваю, чем старый найденный объект и нет ли препятствий между трамваем и объектом
0025: 14@ > 13@ // (float)
86BD: not no_obstacles_between 2@ 3@ 10@ and 4@ 9@ 12@ solid 1 car 0 actor 0 object 0 particle 0
then
continue
end
0509: 12@ = distance_between_XY 4@ 9@ and_XY 5@ 6@
0509: 13@ = distance_between_XY 4@ 9@ and_XY 7@ 8@
if // находится ли новый объект перед трамваем
0035: 13@ >= 12@ // (float)
then
continue
end
if // проверки угла и цвета светофора (если это светофор)
09CC: object 0BJECT model_is 1375 // TRAMSTOP_SF +
then
if and
8045: not 4@ == LAST_0BJECT_X // (float)
8045: not 9@ == LAST_0BJECT_Y // (float)
then
32@ = -900000
08BD: set FLAGS bit TRAM_IS_STOPPING
0485: return_true
return
end
else // объект является светофором
0174: 6@ = car TRAM Z_angle //////////////////////////////////////////////////////////////////////////////////////////////////
0176: 8@ = object 0BJECT Z_angle
0063: 8@ -= 6@ // (float)
0656: get_angle 8@ absolute_degrees_to 8@
if
gosub @CHECK_TRAFFICLIGHT_ANGLE
then
0176: 8@ = object 0BJECT Z_angle
if and
8@ >= 60.0
8@ <= 150.0
then
0AA7: call_function 0x49D3A0 num_params 0 pop 0 9@ // тип светофора 2 WE
else
if and
8@ >= 240.0
8@ <= 330.0
then
0AA7: call_function 0x49D3A0 num_params 0 pop 0 9@ // тип светофора 2 WE
else
0AA7: call_function 0x49D350 num_params 0 pop 0 9@ // тип светофора 1 NS
end
end
for 8@ = 8 to 31
08C3: clear 9@ bit 8@
end // значения функций: 0 - зелёный, 1 - желтый, 2 - красный
if
9@ <> 0
then
0485: return_true
return
end
end
end
until 8AE3: not 0BJECT = random_object_near_point 2@ 3@ 10@ in_radius Y_DIMENSION find_next 1
end
8485: return_false
return
:CHECK_TRAFFICLIGHT_ANGLE // проверяем, является ли светофор попутным трамваю
if or
8@ > 315.0
8@ < 45.0
then
0485: return_true
return
end
if or
09CC: object 0BJECT model_is 1283
09CC: object 0BJECT model_is 1284
then
if and
8@ > 135.0
8@ < 225.0
then
0485: return_true
return
end
end
8485: return_false
return
Last edited by Den_spb (16-11-2010 02:25)
Offline
Жесть!!!
Offline
Да, по описанию крутняк ))
Offline
Ещё бы версию под cleo 3, если возможно ))
Offline
Переделывать под КЛЕО3 не буду, т.к. это довольно трудоёмко (например, в КЛЕО4 интерцептор состоит из одного опкода, а в КЛЕО3 для его использования надо писать большой кусок кода). Лучше установи КЛЕО4.
Offline
Переделывать под КЛЕО3 не буду, т.к. это довольно трудоёмко (например, в КЛЕО4 интерцептор состоит из одного опкода, а в КЛЕО3 для его использования надо писать большой кусок кода). Лучше установи КЛЕО4.
Тогда мне как минимум надо будет проверить 60 скриптов на совместимость с клео4, половину(а то и больше) из которых придётся переписывать. И не факт, что переписать удастся, например тот же мод с картой по нажатию клавиши.
Offline
Ну например вот - http://gtag.gtagaming.com/forums/index. … wtopic=358
там же есть и решение как пофиксить.
Offline
Исправил ошибку, которая могла приводить к вылетам при высадке пассажира из трамвая. Всё дело в этой конструкции:
0432: PASSENGER_0 = get_actor_handle_from_car TRAM passenger_seat 0
if and
056D: actor PASSENGER_0 defined
803C: not $PLAYER_ACTOR == PASSENGER_0 // (int)
then
0633: AS_actor PASSENGER_0 exit_carЕсли PASSENGER_0 не существует, то 0432 возвращает отрицательный хэндл, а проверка на существование почему-то его пропускает. Я заменил проверку на существование проверкой хэндла на неотрицательность
if and
PASSENGER_0 > 0
803C: not $PLAYER_ACTOR == PASSENGER_0 // (int)
then
0633: AS_actor PASSENGER_0 exit_carАрхив в первом сообщении обновлён.
Offline
0432: PASSENGER_0 = get_actor_handle_from_car TRAM passenger_seat 0
Вот этот опкод не стоит использовать, т.к он ставит Reference флаг на актера, поэтому лучше пройтись по стркутуре авто и вычислить пассажира.
I know everything and nothing...
Offline
0432: PASSENGER_0 = get_actor_handle_from_car TRAM passenger_seat 0
Вот этот опкод не стоит использовать, т.к он ставит Reference флаг на актера, поэтому лучше пройтись по стркутуре авто и вычислить пассажира.
Нет, пассажиры после выхода из трамвая исчезают при первой возможности (для контроля я создавал маркеры над ними).
Offline
Да нет говорю же
0432: PASSENGER_0 = get_actor_handle_from_car TRAM passenger_seat 0
Как то я пользовался этим и стал наблюдать, что некоторые педы оставались на своих местах не пропадали. Но может это не так раз ты утверждаешь, что они пропадают.
I know everything and nothing...
Offline