Перейти к содержанию

Обсуждение и публикация Cleo-скриптов


Рекомендуемые сообщения

[spoiler=пример]

{$CLEO}
0000:
// здесь выполняются команды один раз с момента запуска скрипта, например:
if
  0AA9: is_game_version_original
then
    0AD1: show_formatted_text_highpriority "This game version %.1f" time 7000 1.0
else
    0AD1: show_formatted_text_highpriority "This game version not %.1f stop script" time 7000 1.0
    0A93: end_custom_thread
end

while true // главный цикл начало
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then // начало блока, где выполняются команды, если игрок найден
        if 
          Actor.Driving($PLAYER_ACTOR)
        then // начало блока, где выполняются команды, если игрок водит транспорт 
            03C0: 31@ = actor $PLAYER_ACTOR car
            0441: 30@ = car 31@ model
            
            //------------------
            if 
              0A01: model 30@ car
            then  // начало блока, где выполняются команды, если транспорт является автомобилем
                0A97: 2@ = car 31@ struct
                0A8E: 6@ = 2@ + 0x438 // extra 1
                0A8D: 6@ = read_memory 6@ size 1 virtual_protect 0
                0A8E: 7@ = 2@ + 0x439 // extra 2
                0A8D: 7@ = read_memory 7@ size 1 virtual_protect 0
                03F0: enable_text_draw 1   
                045A: draw_text_1number 5.0 5.0 GXT 'NUMBER' number 6@ 
                045A: draw_text_1number 5.0 15.0 GXT 'NUMBER' number 7@
            
                //------------------
                if 
                  0AB0: key_pressed 50 // клавиша 2
                then // начало блока, где выполняются команды, если была нажата клавиша
                    0AB1: call_scm_func @MoveCarComponents 2  31@ 1.0 // вызываем нашу функцию
                    wait 2000
                    if 
                      not Car.Wrecked(31@)
                    then
                        0AB1: call_scm_func @MoveCarComponents 2  31@ -1.0 // вызываем нашу функцию с другим параметром
                    end
                    repeat // цикл приостанавливает дальнейшую работу скрипта до того момента пока не будет отпущена клавиша
                       wait 0
                    until 8AB0: not key_pressed 50 // клавиша 2
                end  // конец блока, где выполняются команды, если была нажата клавиша
                //------------------
            
                //------------------
                if 
                  0AB0: key_pressed 51 // клавиша 3
                then // начало блока, где выполняются команды, если была нажата клавиша
                    if 
                      not Car.Wrecked(31@)
                    then
                        // пример использования переменной таймера в других целях
                        0209: 32@ = random_int_in_ranges 2 4 // правое значение не входит в выбираемый диапазон
                        gosub @OpenComponent // переходим на блок открытия/закрытия компонента
                    end
                    repeat // цикл приостанавливает дальнейшую работу скрипта до того момента пока не будет отпущена клавиша
                       wait 0
                    until 8AB0: not key_pressed 51 // клавиша 3
                end  // конец блока, где выполняются команды, если была нажата клавиша
                //------------------
                
            else // блок, где выполняются команды, если транспорт НЕ является автомобилем
                0AD1: show_formatted_text_highpriority "This vehicle not car, ID vehicle %d" time 500 30@
            end // конец блока, где выполняются команды, если транспорт является автомобилем
            //------------------
            
        end // конец блока, где выполняются команды, если игрок водит транспорт  
    end // конец блока, где выполняются команды, если игрок найден 
end // главный цикл конец, дальше переход на начало главного цикла        


//------------------call_scm_func
:MoveCarComponents // сюда в переменную 0@ записалось авто, в 1@ значение на которое будет изменяться положение компонентов авто 
28@ = 0x64C 
for 30@ = 1 to 24  // начало цикла for без wait, цикл без wait можно использовать только для небольшого количества итераций, в функциях цикл с wait не используется
   0A97: 31@ = car 0@ struct
   005A: 31@ += 28@
   28@ += 0x4
   0A8D: 31@ = read_memory 31@ size 4 virtual_protect 0
   if
     31@ > 0
   then // начало блока, где выполняются команды, если компонент есть
       31@ += 64
       0A8D: 2@ = read_memory 31@ size 4 virtual_protect 0 
       005B: 2@ += 1@  // (float)  изменяем координату X
       31@ += 4
       0A8D: 3@ = read_memory 31@ size 4 virtual_protect 0
       005B: 3@ += 1@  // (float)  изменяем координату Y
       31@ += 4
       0A8D: 4@ = read_memory 31@ size 4 virtual_protect 0
       // координату Z не изменяем
       31@ -= 56
       0AA6: call_method 0x59AF80 struct 31@ num_params 3 pop 0 4@ 3@ 2@
   end  // конец блока, где выполняются команды, если компонент есть
end  // конец цикла for без wait
0AB2: ret 0
//------------------


//------------------gosub
:OpenComponent
0085: 27@ = 32@ // (int) переписываем значение из переменной 32@ в другую переменную, поскольку после wait там будет другое значение
095F: get_car 31@ door 27@ angle_to 25@
if 
  25@ == 0.0
then // начало блока, где выполняется открытие/закрытие компонента, здесь открытие в цикле for
    for 12@ = 0.0 TO 1.0 step 0.1
       if 
         not Car.Wrecked(31@)
       jf break
       08A6: set_car 31@ door 27@ rotation_to 12@
       wait 0
    end
else // здесь закрытие в цикле while
    12@ = 0.9
    while 0021: 12@ > 0.0
       if 
         not Car.Wrecked(31@)
       jf break
       08A6: set_car 31@ door 27@ rotation_to 12@
       wait 0
       12@ -= 0.1
    end
    if 
      not Car.Wrecked(31@)
    then
        08A6: set_car 31@ door 27@ rotation_to 0.0
    end     
end // конец блока, где выполняется открытие/закрытие компонента
return // возвращаемся на строчку после места вызова gosub
//------------------

 



При декомпиляции и отказе открыть исходный код, получишь знакомую картину
[spoiler=меточный стиль]

// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP 
if 
0AA9:   is_game_version_original 
jf @Noname_57 
0AD1: show_formatted_text_highpriority "This game version %.1f" time 7000 1.0  
jump @Noname_110 

:Noname_57
0AD1: show_formatted_text_highpriority "This game version not %.1f stop script" time 7000 1.0  
0A93: end_custom_thread 

:Noname_110
wait 0 
if 
   Player.Defined($PLAYER_CHAR)
jf @Noname_486 
if 
   Actor.Driving($PLAYER_ACTOR)
jf @Noname_486 
31@ = Actor.CurrentCar($PLAYER_ACTOR)
30@ = Car.Model(31@)
if 
0A01:   model 30@ car 
jf @Noname_440 
0A97: 2@ = car 31@ struct 
0A8E: 6@ = 2@ + 1080 // int 
0A8D: 6@ = read_memory 6@ size 1 virtual_protect 0 
0A8E: 7@ = 2@ + 1081 // int 
0A8D: 7@ = read_memory 7@ size 1 virtual_protect 0 
03F0: enable_text_draw 1 
045A: draw_text_1number 5.0 5.0 GXT 'NUMBER' number 6@  // ~1~
045A: draw_text_1number 5.0 15.0 GXT 'NUMBER' number 7@  // ~1~
if 
0AB0:   key_pressed 50 
jf @Noname_371 
0AB1: call_scm_func @Noname_493 2 31@ 1.0  
wait 2000 
if 
   not Car.Wrecked(31@)
jf @Noname_356 
0AB1: call_scm_func @Noname_493 2 31@ -1.0  

:Noname_356
wait 0 
8AB0:   not key_pressed 50 
jf @Noname_356 

:Noname_371
if 
0AB0:   key_pressed 51 
jf @Noname_433 
if 
   not Car.Wrecked(31@)
jf @Noname_418 
0209: 32@ = random_int_in_ranges 2 4 
gosub @Noname_691 

:Noname_418
wait 0 
8AB0:   not key_pressed 51 
jf @Noname_418 

:Noname_433
jump @Noname_486 

:Noname_440
0AD1: show_formatted_text_highpriority "This vehicle not car, ID vehicle %d" time 500 30@  

:Noname_486
jump @Noname_110 

:Noname_493
28@ = 1612 
30@ = 1 

:Noname_508
0A97: 31@ = car 0@ struct 
005A: 31@ += 28@ // (int) 
28@ += 4 
0A8D: 31@ = read_memory 31@ size 4 virtual_protect 0 
if 
  31@ > 0 
jf @Noname_665 
31@ += 64 
0A8D: 2@ = read_memory 31@ size 4 virtual_protect 0 
005B: 2@ += 1@ // (float) 
31@ += 4 
0A8D: 3@ = read_memory 31@ size 4 virtual_protect 0 
005B: 3@ += 1@ // (float) 
31@ += 4 
0A8D: 4@ = read_memory 31@ size 4 virtual_protect 0 
31@ -= 56 
0AA6: call_method 5877632 struct 31@ num_params 3 pop 0 4@ 3@ 2@  

:Noname_665
30@ += 1 
  30@ > 24 
jf @Noname_508 
0AB2: ret 0 

:Noname_691
0085: 27@ = 32@ // (int) 
095F: get_car 31@ door 27@ angle_to 25@ 
if 
  25@ == 0.0 
jf @Noname_806 
12@ = 0.0 

:Noname_741
if 
   not Car.Wrecked(31@)
jf @Noname_799 
08A6: set_car 31@ door 27@ rotation_to 12@ 
wait 0 
12@ += 0.1 
  12@ > 1.0 
jf @Noname_741 

:Noname_799
jump @Noname_910 

:Noname_806
12@ = 0.9 

:Noname_816
  12@ > 0.0 
jf @Noname_881 
if 
   not Car.Wrecked(31@)
jf @Noname_881 
08A6: set_car 31@ door 27@ rotation_to 12@ 
wait 0 
12@ -= 0.1 
jump @Noname_816 

:Noname_881
if 
   not Car.Wrecked(31@)
jf @Noname_910 
08A6: set_car 31@ door 27@ rotation_to 0.0 

:Noname_910
return 

 

 

Ссылка на комментарий
Поделиться на другие сайты

svyatogor2007, Доброго времени суток. Потестил скрипт с jf вместо jump. В итоге получил такую же картинку. Пока скрипт запущен в первый раз все работает. Сохраняем ее, загружаем это же сохранение и все, встали.) Маркеры больше не пропадают после взятия пикапа. Так что это не основная проблема. Будем думать дальше.

Ссылка на комментарий
Поделиться на другие сайты

svyatogor2007, Доброго времени суток. Потестил скрипт с jf вместо jump. В итоге получил такую же картинку. Пока скрипт запущен в первый раз все работает. Сохраняем ее, загружаем это же сохранение и все, встали.) Маркеры больше не пропадают после взятия пикапа. Так что это не основная проблема. Будем думать дальше.

Попробуй удалить Cleo_Saves, ибо у меня после сохранения нормально все работало.

Ссылка на комментарий
Поделиться на другие сайты

Попробуй удалить Cleo_Saves, ибо у меня после сохранения нормально все работало.

После сохранения работает. Но ты пробовал сохраниться, выйти из игры и загрузить то сохранение (хотя можно и без выхода), вот тогда уже начинается шляпа. Нашел  проверку на существования маркера (075C:   marker 0@ enabled), чтобы при загрузке сохранения уже с нарисованными иконками скрипт не рисовал их по новой. Но в итоге маркер совсем перестал рисоваться :facepalm:   Кто подскажет, что не так в этот раз. По сути запускаем поток, идет проверка на существования маркера: если есть тогда идем на вторую метку, где стоит условие, при котором маркер будет удалятся;  если маркера нет, то уже идет проверка существования пикапа, и если пикап существует - создается маркер в указанных координатах и далее идем до конца скрипта. 

 

[spoiler=Код]{$CLEO .cs}

0A95: enable_thread_saving

thread 'Oysters 1-32'

 

:OYSTER1

wait 0

if

075C: marker 11@ enabled

then

jump @OYSTER2

else

jf @OYSTER1

end

 

if

048C: is_any_pickup_at_coords 155.0 -1975.0 -8.0

then

11@ = Marker.CreateIconWithoutSphere(64, 155.0, -1975.0, -8.0)

end

 

 

:OYSTER2

wait 0

if

pickup.Picked_up($2992)

then

Marker.Disable(11@)

11@ = 0

end

 

if

11@ == 0

then

end_thread

end

 

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

После установки скрипта от Кенкинга "Дизель v. 2.0" (выхлоп происходит только, когда авто трогается с места, ставил эту версию)  появляется огненный шар и потом дизельный выхлоп.

http://thumbs2.imagebam.com/0d/fd/05/b8bacc1064173054.jpghttp://thumbs2.imagebam.com/03/ac/51/3f2a611064187284.jpg

Установлены ENB MMGE 2 (Marty McFly), Silent Patch, IMFX (DK22Pac). Как можно убрать огонь из выхлопных труб?

При замене эффектов всё работает, но тогда теряется смысл установки ENB. Что скажет Кенкинг? Будет доработка или нет?

Просто альтернативы скрипту нету.

"Удивительно начитанный человек" (alexanderliss)

 

"Значит, если сегодня - это вчерашнее завтра, то завтра будет вчерашним сегодня... Так? Время - странная штука." (Stray - Глава IV. Трущобы. Робот Рози)

 

 

Ссылка на комментарий
Поделиться на другие сайты

При замене эффектов всё работает, но тогда теряется смысл установки ENB. Что скажет Кенкинг? Будет доработка или нет?

Просто альтернативы скрипту нету.

Кидал выше офигенную альтернативу с возможностью настройки густоты и установки любого цвета для любого ID, где же нету?

Ссылка на комментарий
Поделиться на другие сайты

Доработал скрипт "новый алгоритм движения поездов" от Den_Spb. Что сделано:

 

1. На станции Йеллоубелл и участке от Йеллоубелл до Линден теперь может появляться как внутренний, так и внешний поезд (раньше внешний поезд там вообще никогда не появлялся). Причем когда игрок на самой станции, могут появляться оба поезда одновременно (когда между станциями - только по очереди).

 

2. Светофор внутреннего пути на станции Йеллоубелл, светофоры возле туннеля и светофор внешнего пути на станции Линден теперь включаются красным также при появлении встречных поездов и обратно зеленым (или желтым) при их проезде мимо или заезде на 2-путный участок. Впрочем, на станции Линден на практике почти не актуально, но пусть будет. Если ехать на поезде машинистом или пассажиром и проезжать мимо тех светофоров, тоже все правильно будут светить.

 

 

 

3. Поезда появляются и исчезают за 700 метров, 600 при хорошей дальности прорисовки было маловато. И ездят со скоростью 120 км/ч, тормозят на станциях в правильном месте (глюк был замечен только 1 раз, когда Карл был в таком месте, что поезд появился перед самой станцией и остановился чуть дальше, чем надо было).

 

4. Когда внутренний поезд собирается отправляться с Йеллоубелл, а встречный поезд уже появился и горит красный светофор, внутренний поезд будет его ждать и поедет уже на зеленый светофор, когда внешний уедет на 2-путку. На станции Линден для встречного поезда аналогично, но на практике обычно ждать не приходится.

 

Минусы:

 

1. Если в случае, описанном в пункте 4, угнать поезд и поехать на красный, поезда проедут друг через друга, но такое было и в оригинальном скрипте, если поехать на однопутку задним ходом. Как в таких случаях вызывать сход обоих поездов с рельсов, я не знаю.

 

2. При миссии машиниста на внутреннем кольце, если придется ждать на Йеллоубелл зеленого светофора, не знаю, реально ли будет потом успеть по расписанию. Но ждать там поезду обычно долго не приходится.

 

В остальном, глюков больше не замечал, тестировал практически по всей территории возле однопутных участков.

Делал главным образом для себя, так что не знаю как быть с авторскими правами.

Навыки программирования у меня никакие, но очень хотелось добавить еще больше реализма по ЖД

 

[spoiler=код]//
//-----------------------------ГТА СА: НОВЫЙ АЛГОРИТМ ДВИЖЕНИЯ ПОЕЗДОВ, ВЕРСИЯ 5--------(by Den_spb)-------------------------------------------
//--- доработка Andrew_synthwave85 ---
//
// -----------------------------------------------------------------------------------------------------------------------Назначение переменных
{
0@ - одноразовое дробное число (значение используется в пределах одной операции или последовательной группы операций)
1@ - одноразовое дробное число
2@ - одноразовое дробное число
3@ - одноразовое дробное число
4@ - одноразовое дробное число
5@ - указатель на маркер внутреннего поезда
6@ - одноразовое дробное число
7@ - одноразовое целое число
8@ - указатель на внутренний поезд
9@ - указатель на внешний поезд
10@ - указатель на маркер внешнего поезда
11@ - минимальное расстояние внутреннего поезда до точки остановки, при котором может включиться торможение
12@ - максимальное расстояние внутреннего поезда до точки остановки, при котором может включиться торможение
13@ - минимальное расстояние внешнего поезда до точки остановки, при котором может включиться торможение
14@ - максимальное расстояние внешнего поезда до точки остановки, при котором может включиться торможение
15@ - запись значения производится из адреса памяти при проверке траффика поездов (вкл или откл)
16@ - значение, с которым сравнивается значение таймера событий внутреннего поезда (ожидание перед созданием поезда, стоянка на станции)
17@ - значение, с которым сравнивается значение таймера событий внешнего поезда (ожидание перед созданием поезда, стоянка на станции)
18@ - статус внутреннего поезда.
Значения статусов
0 - поезд не существует. Время, по истечении которого может быть создан поезд, не отсчитывается
1 - поезд не существует. Время, по истечении которого может быть создан поезд, отсчитывается или уже истекло
2 - поезд существует
3 - поезд тормозит на станции
4 - поезд стоит на станции
19@ - статус внешнего поезда. Значения те же.
20@ - одноразовое целое число
21@ - одноразовое целое число
22@ - одноразовое целое число
23@ - одноразовое целое число
24@ - одноразовое целое число
25@ - одноразовое целое число
26@ - указатель на внутренний мачтовый светофор
27@ - указатель на внешний мачтовый светофор
28@ - одноразовое дробное число
29@ - одноразовое дробное число
30@ - флаг автоведения внутреннего поезда.
Значения
0 - в кабине поезда CJ либо поезд не существует - автоведение отключено
1 - в кабине поезда бот - автоведение включено
31@ - флаг автоведения внешнего поезда. Значения те же.
32@ - таймер 1. Используется в событиях внутреннего поезда
33@ - таймер 2. Используется в событиях внешнего поезда
34@
35@
36@
37@
}
//------------------------------------------------------------------------------------------------------------------------------Начало скрипта
{$CLEO .cs}
0A95: enable_thread_saving // чтобы объекты (светофоры), созданные скриптом, не оставались на карте после сохранения игры
var // идентификация типа переменных
20@ : Integer
21@ : Integer
22@ : Integer
23@ : Integer
24@ : Integer
25@ : Integer
end
16@ = 0
17@ = 0
30@ = 0
31@ = 0
32@ = 0
33@ = 0
while true //------------------------------------------------------------------------------------------------------------Главный цикл скрипта
wait 0
if //--------------------------------------------------------------------------Операции для внутреннего поезда (поезд пока не существует)
856E: not car 8@ defined
then
if
18@ <> 1
then
18@ = 1
0209: 16@ = random_int_in_ranges 31 61 //15 21 // min и max время в секундах, по истечении которого может быть создан внутренний поезд
16@ *= 1000
32@ = 0
else
0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0 // читаем адрес памяти, чтобы узнать, вкл или откл траффик поездов
if and
15@ == 0 // траффик включен, следовательно ж д миссии не запущены. Можем продолжать
001D: 32@ > 16@ // (int)
then
actor.StorePos($PLAYER_ACTOR,3@,4@,6@)
if
056E: car 9@ defined
then
car.StorePos(9@,0@,1@,2@)
else
0@ = 0.0
1@ = 0.0
end
if or
0@ < 2520.0
1@ < 1330.0 // если внешний поезд стоит на станции Линден или только отправился с нее, внутренний не будет создан
then
if or
3@ < 1500.0
4@ < 1360.0
856E: not car 9@ defined // если игрок в однопутной зоне и существует внешний поезд, то внутренний поезд создан не будет
then
// вся плоскость игровой карты делится на части. Минимум - на 2, в этом скрипте - на 4 (карта делится осями Y и X)
// в каждой части карты должны проходить ж д пути, иначе деление нецелесообразно
if
3@ >= 0.0 // игрок в правой половине карты
then
if
4@ >= 0.0
then
21@ = 1 // номер квадранта
else
21@ = 2
end
else
if
4@ >= 0.0
then
21@ = 4
else
21@ = 3
end
end
// Файл tracks2.dat делится на наборы в соответствии с делением плоскости карты. После того, как определено,
// в какой части карты находится игрок, выбирается соответствующий набор точек.
// Далее производится последовательная проверка расстояния игрока до точек набора.
// Проверка осуществляется от дальних точек к ближним, по ходу движения поезда.
// Расстояние между точками около 300 м (менее 300 м). Первая точка набора берётся не у границы части карты (квадранта),
// а на 600 м раньше - на случай, если игрок находится вблизи границы квадрантов (частей карты).
// Проверяются два набора точек - тот, который соответствует части карты и следующий, по ходу движения поезда.
// Если расстояние между игроком и точкой меньше 600 м, то осуществляется переход на код создания поезда.
// Иначе, после проверки двух наборов выполнение данной части кода прекращается.
// Понятно, что поезд может быть создан на расстоянии 300 - 600 м от игрока.
// Для внешнего поезда эта часть кода аналогична, только наборы будут проверяться в обратном порядке,
// тоже по ходу движения поезда. Файл маршрута для внешнего поезда - tracks4.dat
if
21@ == 1
then
jump @kvad_1t1
end
if
21@ == 2
then
jump @kvad_2t1
end
if
21@ == 3
then
jump @kvad_3t1
end
if
21@ == 4
then
jump @kvad_4t1
end
:kvad_1t1 //------------------------------------------------------------------------------Внутренний поезд. Набор точек 1
0@ = -598.09 // данная часть кода была написана pas-программой автоматически
1@ = 1188.22
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@ // расстояние между игроком и точкой
2@ > 700.0 // если расстояние меньше 700 м, то перейти на код создания поезда
jf @create1 // метка, где начинается код создания поезда
0@ = -325.94
1@ = 1248.88
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -35.79
1@ = 1293.15
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 241.37
1@ = 1229.34
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 536.14
1@ = 1247.17
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 739.12
1@ = 1461.33
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 742.99
1@ = 1697.59
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 742.51
1@ = 1787.34
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 740.75
1@ = 2026.49
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 726.84
1@ = 2321.07
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 801.16
1@ = 2609.48
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1072.24
1@ = 2722.62
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1236.12
1@ = 2632.27
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1481.99
1@ = 2632.34
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1774.87
1@ = 2675.03
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2021.92
1@ = 2694.18
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2229.69
1@ = 2690.17
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2519.59
1@ = 2639.43
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2552.81
1@ = 2344.89
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2735.05
1@ = 2111.73
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2781.06
1@ = 1816.16
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2856.25
1@ = 1531.03
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2864.77
1@ = 1239.22
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2764.76
1@ = 983.25
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2764.79
1@ = 743.27
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
if
21@ == 4 // если игрок находится в 4 квадранте, то заканчиваем проверку
then
jump @_5 // метка, расположенная после кода создания поезда
end
:kvad_2t1 //---------------------------------------------------------------------------Внутренний поезд. Набор точек 2
0@ = 2765.28
1@ = 528.72
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2781.32
1@ = 239.50
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2827.61
1@ = 36.33
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2763.10
1@ = -250.25
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2467.57
1@ = -275.00
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2192.47 // point 1
1@ = -357.99
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2122.11 // point 2
1@ = -647.61
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2284.98
1@ = -897.82
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2284.99
1@ = -1186.05
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2273.19
1@ = -1484.06
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 2198.65
1@ = -1760.34
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1989.68
1@ = -1953.75
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1696.98
1@ = -1953.73
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1398.43
1@ = -1948.14
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1197.64
1@ = -1779.76
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 1002.70
1@ = -1556.24
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 815.00
1@ = -1366.51
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 778.25
1@ = -1333.63
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
if
21@ == 1
then
jump @_5
end
:kvad_3t1 //-------------------------------------------------------------------------Внутренний поезд. Набор точек 3
0@ = 589.52
1@ = -1187.75
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 335.44
1@ = -1061.40
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = 49.59
1@ = -1018.00
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -237.89
1@ = -1069.90
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -470.71
1@ = -1253.47
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -742.62
1@ = -1133.88
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -847.02
1@ = -1404.64
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1113.11
1@ = -1514.30
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1392.21
1@ = -1509.24
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1676.36
1@ = -1465.42
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1876.64
1@ = -1258.10
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1976.75
1@ = -995.47
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1978.81
1@ = -717.47
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
if
21@ == 2
then
jump @_5
end
:kvad_4t1 //--------------------------------------------------------------------------Внутренний поезд. Набор точек 4
0@ = -1980.12
1@ = -592.06
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1960.09
1@ = -296.04
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1944.42
1@ = -11.95
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1942.72
1@ = 171.88
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1756.16
1@ = 399.26
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1523.12
1@ = 568.50
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1290.21
1@ = 737.81
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -1082.96
1@ = 888.28
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -992.44
1@ = 954.08
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
0@ = -760.64
1@ = 1122.39
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create1
if
21@ == 3
then
jump @_5
end
jump @kvad_1t1
:create1 //---------------------------------------------------------------------------------Создание внутреннего поезда
0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0
if
15@ == 0 // траффик поездов включен (ж д миссии не запущены)
then
while true
wait 0
0209: 21@ = random_int_in_ranges 0 16 // выбираем тип поезда (1-15)
if and
21@ <> 8
21@ <> 9
21@ <> 10
21@ <> 11
21@ <> 12 // если тип поезда не трамвайный (8, 9, 14)
21@ <> 13 // и не зарезервированный для миссий (10 - 13), то выбор сделан
21@ <> 14 // 15-й тип оставил, там локомотив без вагонов
then
break // выход из цикла
end
end
7@ = -382234 // начало блока адресов памяти, в которых записаны ИД модели вагонов всех поездов
21@ *= 16 // номер типа * максимальное количество вагонов в типе
005A: 7@ += 21@ // (int) - находим начало выбранного типа поезда
0016: 21@ /= 16
11@ = 6.643 // зависимость тормозного пути от кол-ва вагонов на скорости 60 км/ч определяется формулой
// Тп = 6,643 + 6,357 * количество вагонов; на скорости 120 км/ч цифру 6,357 умножаем на 4
while &0(7@,1i) <> 0 // пока ИД вагона ненулевой
Model.Load(&0(7@,1i)) // загружаем необходимые модели
11@ += 25.428 // и одновременно считаем минимальный тормозной путь
7@ += 1
end
0087: 12@ = 11@ // (float)
12@ += 80.0
// при скорости 60 км/ч разница между мин. и макс. тормозными путями 20 м; при скорости 120 км/ч - 80 м
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
while &0(7@,1i) <> 0 // последовательно проверяем, загружены ли модели
repeat
wait 0
until Model.Available(&0(7@,1i))
7@ += 1
end
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
7@ += 14 // адрес модели 14 вагона выбранного типа
if and // можно сделать поезд 19 вагонным, но только если выполнены условия
&0(7@,1i) <> 0 // в поезде будет существовать 14 вагон
21@ < 7 // тип поезда 0-6 (остальные типы - это трамваи и поезда, используемые в миссиях)
then
22@ = &0(7@,1i) // ИД 14 вагона
7@ += 1
&0(7@,1i) = 22@ // ИД вагона 15 (0) заменена на 14
7@ += 1
23@ = &0(7@,1i) // сохраняем в памяти ИД вагона 16 (первый вагон следующего за выбранным типа)
&0(7@,1i) = 22@ // назначаем ИД 16 вагона такой же, как у 14
7@ += 1
20@ = &0(7@,1i) // ИД 17 вагона
&0(7@,1i) = 22@
7@ += 1
24@ = &0(7@,1i) // ИД 18 вагона
&0(7@,1i) = 22@
7@ += 1
25@ = &0(7@,1i) // ИД 19 вагона (последнего)
&0(7@,1i) = 0
end
// в файле маршрутов стандартной игры есть 2 особые точки
// внутренний путь в тех местах располагается выше, чем соседний путь.
// Поэтому поезд создается на пути противоположного направления.
// Чтобы этого избежать, задаем высоту создания поезда для этих точек отдельно.
if and
0@ == 2192.47 // особая точка 1
1@ == -357.99
then
06D8: 8@ = create_train_at 0@ 1@ 60.0 type 21@ direction 1
else
if and
0@ == 2122.11 // особая точка 2
1@ == -647.61
then
06D8: 8@ = create_train_at 0@ 1@ 70.0 type 21@ direction 1
else // выбрана какая-то другая точка
06D8: 8@ = create_train_at 0@ 1@ 0.0 type 21@ direction 1
end // высоту для всех остальных точек можно брать одинаковую - 0.0
end
18@ = 2
30@ = 1
06DC: set_train 8@ acc 33.33 // назначаемая поезду скорость -
06DD: set_train 8@ speed 33.33 // 120 км/ч
{if
$ONMISSION == 0 // во время миссии маркер будет мешать
then
5@ = Marker.CreateAboveCar(8@)
Marker.SetColor(5@, 0x807000FF) // 0
018B: set_marker 5@ radar_mode 2
end}
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
7@ += 14
if and // если были прицеплены дополнительные вагоны, то восстанавливаем значения ИД
&0(7@,1i) <> 0
21@ < 7
then
7@ += 1 // 15
&0(7@,1i) = 0
7@ += 1 // 16
&0(7@,1i) = 23@
7@ += 1 // 17
&0(7@,1i) = 20@
7@ += 1 // 18
&0(7@,1i) = 24@
7@ += 1 // 19
&0(7@,1i) = 25@
end
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
while &0(7@,1i) <> 0 // удаляем модели вагонов из памяти
Model.Destroy(&0(7@,1i))
7@ += 1
end
end
end
end
end
end
end
:_5
if //---------------------------------------------------------------------------Операции для внешнего поезда (поезд пока не существует)
856E: not car 9@ defined
then
if
19@ <> 1
then
19@ = 1
0209: 17@ = random_int_in_ranges 31 61 //15 21 // min и max время в секундах, по истечении которого может быть создан внешний поезд
17@ *= 1000
33@ = 0
else
0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0 // читаем адрес памяти, чтобы узнать, вкл или откл траффик поездов
if and
15@ == 0 // траффик включен, следовательно ж д миссии не запущены. Можем продолжать
001D: 33@ > 17@ // (int)
then
actor.StorePos($PLAYER_ACTOR,3@,4@,6@)
if
056E: car 8@ defined
then
car.StorePos(8@,0@,1@,2@)
else
0@ = 0.0
1@ = 0.0
end
if or
0@ < 1470.0 // если внутренний поезд стоит на станции Йеллоубелл или только отправился с нее, внешний поезд не будет создан
1@ < 2620.0
then

if or
3@ < 1500.0
4@ < 1360.0
856E: not car 8@ defined // если игрок в однопутной зоне и существует внутренний поезд, то внешний поезд создан не будет
then
if
3@ >= 0.0 // игрок в правой половине карты
then
if
4@ >= 0.0
then
21@ = 1 // номер квадранта
else
21@ = 2
end
else
if
4@ >= 0.0
then
21@ = 4
else
21@ = 3
end
end
if
21@ == 1
then
jump @kvad_1t4
end
if
21@ == 2
then
jump @kvad_2t4
end
if
21@ == 3
then
jump @kvad_3t4
end
if
21@ == 4
then
jump @kvad_4t4
end
:kvad_4t4 //------------------------------------------------------------------------------Внешний поезд. Набор точек 4
0@ = 515.98
1@ = 1240.23
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 226.84
1@ = 1238.51
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -53.40
1@ = 1296.12
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -347.38
1@ = 1247.21
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -631.83
1@ = 1185.07
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -880.27
1@ = 1040.72
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1030.44
1@ = 931.37
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1240.99
1@ = 778.43
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1342.19
1@ = 704.87
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
if
21@ == 1
then
jump @_6
end
:kvad_3t4 //----------------------------------------------------------------------------Внешний поезд. Набор точек 3
0@ = -1498.99
1@ = 590.90
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1601.06
1@ = 516.83
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1837.42
1@ = 347.58
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1948.42
1@ = 100.00
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1950.42
1@ = -190.28
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1982.39
1@ = -488.08
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1982.55
1@ = -768.10
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1971.89
1@ = -1059.67
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1846.91
1@ = -1309.37
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1629.08
1@ = -1486.73
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1347.52
1@ = -1513.87
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -1053.53
1@ = -1508.42
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -835.57
1@ = -1370.31
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -718.41
1@ = -1128.25
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
if
21@ == 4
then
jump @_6
end
:kvad_2t4 //------------------------------------------------------------------------------Внешний поезд. Набор точек 2
0@ = -596.65
1@ = -1164.91
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -349.44
1@ = -1223.16
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = -137.48
1@ = -1027.47
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 151.78
1@ = -1026.41
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 438.87
1@ = -1107.08
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 690.56
1@ = -1266.07
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 910.87
1@ = -1464.63
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1097.41
1@ = -1669.80
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1293.72
1@ = -1894.03
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1573.67
1@ = -1957.68
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1857.49
1@ = -1957.93
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2152.76
1@ = -1957.85
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2205.95
1@ = -1686.16
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2288.74
1@ = -1407.02
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2288.95
1@ = -1110.09
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2281.21
1@ = -816.01
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2078.88
1@ = -607.04
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
if
21@ == 3
then
jump @_6
end
:kvad_1t4 //-------------------------------------------------------------------------------Внешний поезд. Набор точек 1
0@ = 2062.91
1@ = -593.55
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2087.84
1@ = -365.31
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2367.59
1@ = -284.31
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2661.26
1@ = -298.92
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2832.24
1@ = -92.44
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2805.30
1@ = 182.18
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2769.17
1@ = 442.68
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2768.74
1@ = 701.56
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2768.72
1@ = 983.27
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2868.74
1@ = 1239.21
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2860.00
1@ = 1532.27
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2785.01
1@ = 1782.76
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2765.17
1@ = 2066.97
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2563.53
1@ = 2264.64
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2551.77
1@ = 2560.03
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2342.07
1@ = 2694.16
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 2092.40
1@ = 2694.22
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1797.40
1@ = 2682.39
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1510.13
1@ = 2636.25
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 1212.03
1@ = 2637.34
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 957.59
1@ = 2762.66
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 768.57
1@ = 2550.89
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 725.39
1@ = 2288.51
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 736.95
1@ = 2009.09
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 738.76
1@ = 1746.69
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 735.12
1@ = 1461.95
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
0@ = 616.45
1@ = 1297.93
0509: 2@ = distance_between_XY 3@ 4@ and_XY 0@ 1@
2@ > 700.0
jf @create4
if
21@ == 2
then
jump @_6
end
jump @kvad_4t4
:create4 //-------------------------------------------------------------------------------------создание внешнего поезда
0A8D: 15@ = read_memory 0xC38010 size 1 virtual_protect 0
if
15@ == 0 // траффик поездов включен (ж д миссии не запущены)
then
while true
wait 0
0209: 21@ = random_int_in_ranges 0 16 // выбираем тип поезда (1-15)
if and
21@ <> 8
21@ <> 9
21@ <> 10
21@ <> 11
21@ <> 12 // если тип поезда не трамвайный (8, 9, 14)
21@ <> 13 // и не зарезервированный для миссий (10 - 13), то выбор сделан
21@ <> 14 // 15-й тип оставил, там локомотив без вагонов
then
break // выход из цикла
end
end
7@ = -382234 // начало блока адресов памяти, в которых записаны ИД модели вагонов всех поездов
21@ *= 16 // номер типа * максимальное количество вагонов в типе
005A: 7@ += 21@ // (int) - находим начало выбранного типа поезда
0016: 21@ /= 16
13@ = 6.643 // зависимость тормозного пути от кол-ва вагонов на скорости 60 км/ч определяется формулой
// Тп = 6,643 + 6,357 * количество вагонов; на скорости 120 км/ч цифру 6,357 умножаем на 4
while &0(7@,1i) <> 0 // пока ИД вагона ненулевой
Model.Load(&0(7@,1i)) // загружаем необходимые модели
13@ += 25.428 // и одновременно считаем минимальный тормозной путь
7@ += 1
end
0087: 14@ = 13@ // (float)
14@ += 80.0
// при скорости 60 км/ч разница между мин. и макс. тормозными путями 20 м; при скорости 120 км/ч - 80 м
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
while &0(7@,1i) <> 0 // последовательно проверяем, загружены ли модели
repeat
wait 0
until Model.Available(&0(7@,1i))
7@ += 1
end
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
7@ += 14 // адрес модели 14 вагона выбранного типа
if and // можно сделать поезд 19 вагонным, но только если выполнены условия
&0(7@,1i) <> 0 // в поезде будет существовать 14 вагон
21@ < 7 // тип поезда 0-6 (остальные типы - это трамваи и поезда, используемые в миссиях)
then
22@ = &0(7@,1i) // ИД 14 вагона
7@ += 1
&0(7@,1i) = 22@ // ИД вагона 15 (0) заменена на 14
7@ += 1
23@ = &0(7@,1i) // сохраняем в памяти ИД вагона 16 (первый вагон следующего за выбранным типа)
&0(7@,1i) = 22@ // назначаем ИД 16 вагона такой же, как у 14
7@ += 1
20@ = &0(7@,1i) // ИД 17 вагона
&0(7@,1i) = 22@
7@ += 1
24@ = &0(7@,1i) // ИД 18 вагона
&0(7@,1i) = 22@
7@ += 1
25@ = &0(7@,1i) // ИД 19 вагона (последнего)
&0(7@,1i) = 0
end


if and
0@ > 1610.0 // если выбрана точка на однопутке возле станции Yellowbell
0@ < 2170.0
1@ > 2630.0
1@ < 2699.0
then // внеш.поезд должен создаваться только на 2-путке, иначе поедет по внутр.пути
06D8: 9@ = create_train_at 2173.89 2694.16 9.82 type 21@ direction 0
else
if and
0@ > 2540.0 // если выбрана точка на однопутке в туннеле возле депо
0@ < 2785.0
1@ > 1910.0
1@ < 2470.0
then // внеш.поезд должен создаваться только на 2-путке, иначе поедет по внутр.пути
06D8: 9@ = create_train_at 2785.01 1901.28 5.46 type 21@ direction 0
else // выбрана какая-то другая точка
06D8: 9@ = create_train_at 0@ 1@ 0.0 type 21@ direction 0
end // высоту для всех остальных точек можно брать одинаковую - 0.0
end


19@ = 2
31@ = 1
06DC: set_train 9@ acc 33.33 // назначаемая поезду скорость -
06DD: set_train 9@ speed 33.33 // 120 км/ч
{if
$ONMISSION == 0 // во время миссии маркер будет мешать
then
10@ = Marker.CreateAboveCar(9@)
Marker.SetColor(10@, 0x008080FF) // 1
018B: set_marker 10@ radar_mode 2
end}
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
7@ += 14
if and // если были прицеплены дополнительные вагоны, то восстанавливаем значения ИД
&0(7@,1i) <> 0
21@ < 7
then
7@ += 1 // 15
&0(7@,1i) = 0
7@ += 1 // 16
&0(7@,1i) = 23@
7@ += 1 // 17
&0(7@,1i) = 20@
7@ += 1 // 18
&0(7@,1i) = 24@
7@ += 1 // 19
&0(7@,1i) = 25@
end
7@ = -382234
21@ *= 16
005A: 7@ += 21@ // (int)
0016: 21@ /= 16
while &0(7@,1i) <> 0 // удаляем модели вагонов из памяти
Model.Destroy(&0(7@,1i))
7@ += 1
end
end
end
end
end
end
end
:_6 // --------------------------------------------------------------------------------------------------Операции с мачтовыми светофорами
// вся трасса, вдоль котой расставляются светофоры, делится на определённое число блок-участков.
// Пары мачтовых светофоров расставляются вблизи определённых точек на границах блок-участков. В данном скрипте определено 13 точек.
// Нормальная длина блок-участка около 1000 м, минимальная рекомендуемая 600 м (т к в любой момент времени существует только 1 пара светофоров)
// Начинаем с определения ближайшей к игроку точки, рядом с которой будет установлена пара светофоров
// Для этого вычисляем расстояние между игроком и каждой точкой, выбираем наименьшее значение
00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@
3@ = 1431.0647 // X точки 1
4@ = 2634.4133 // Y точки 1
0509: 2@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ // вычисляем расстояние
20@ = 1 // записываем порядковый номер точки
3@ = 2550.8633 // берем координаты следующей точки
4@ = 2498.4736
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@ // определяем дистанцию
if
0025: 2@ > 6@ // (float) // если расстояние игрока до 2 точки меньше, чем до первой
then
0087: 2@ = 6@ // (float) // то сохраняем меньшее значение
20@ = 2 // и номер точки
end
3@ = 2866.9167
4@ = 1287.7421
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 3
end
3@ = 2791.6074
4@ = 218.3158
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 4
end
3@ = 2284.8879
4@ = -331.9585
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 5
end
3@ = 2287.0544
4@ = -1051.7172
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 6
end
3@ = 1919.104
4@ = -1955.9293
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 7
end
3@ = -21.6351
4@ = -1020.1892
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 8
end
3@ = -1260.7156
4@ = -1515.5342
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 9
end
3@ = -1946.1219
4@ = 134.2469
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 10
end
3@ = -915.0107
4@ = 1012.6142
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 11
end
3@ = 156.3303
4@ = 1265.4232
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 12
end
3@ = 739.1387
4@ = 1994.1334
0509: 6@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
0025: 2@ > 6@ // (float)
then
0087: 2@ = 6@ // (float)
20@ = 13
end
// После выполнения данной операции, стал известен номер ближайшей к игроку точки
// Теперь, в соответствии с номером точки, вычисляются координаты установки светофоров и углы их поворота
// Также определяются цвета (модели светофоров)
if
20@ == 1 // Если номер ближайшей к игроку точки - 1, то
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,3@,4@,6@)
else
3@ = 0.0
4@ = 0.0
end
if or
0@ > 1483.521// train position - позиция поезда относительно светофора (условие назначения красного сигнала)
// Предположим, поезд подъезжает к светофору по направлению запад-восток
// Тогда, если X координата поезда больше X координаты светофора, значит, поезд уже проехал светофор
// Условие выполнено и будет назначен красный сигнал
3@ > 1430.0 // чтобы светофор был красным при появлении встречного внеш.поезда с однопутки
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,3@,4@,6@)
else
3@ = 0.0
4@ = 0.0
end
if
32@ < 30000 // если внутр.поезд не существует и с момента исчезновения последнего поезда прошло менее 30000 мс (30 сек)
// то будет назначен желтый сигнал
then
if
3@ < 1430.0 // точка, на которой встречный внеш.поезд уедет на 2-путку на станции Йеллоубелл
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18633 // set traffic light color to red - если появился встречный поезд, включаем красный светофор
end
else
if
3@ < 1430.0 // точка, на которой встречный внеш.поезд уедет на 2-путку на станции Йеллоубелл
then
21@ = 18632 // set traffic light color to green
else
21@ = 18633 // set traffic light color to red - если появился встречный поезд, включаем красный светофор
end
end
end
if // аналогичная операция для внешнего поезда и светофора
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
0@ < 1380.6613// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end // Теперь назначаем координаты и углы поворота светофоров
0@ = 1483.521 // x координата внутреннего светофора
1@ = 2629.804 // y координата внутреннего светофора
2@ = 9.8203 // z координата внутреннего светофора
28@ = 90.0 // z угол внутреннего светофора. Следующие параметры - аналогичные, только для внешнего светофора.
3@ = 1380.6613
4@ = 2638.6968
6@ = 9.8203
29@ = 270.0
jump @lights_1 // назначение координат и моделей выполнено, можно выйти из данной секции
end
if
20@ == 2
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,3@,4@,6@)
else
3@ = 0.0
4@ = 5000.0 // такое число сугубо для технической надобности
end
if or
1@ < 2489.8071// train position
4@ < 2630.0 // чтобы светофор был красным при появлении внеш.поезда с однопутки
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,3@,4@,6@)
else
3@ = 0.0
4@ = 5000.0 // такое число сугубо для технической надобности
end
if
32@ < 30000
then
if
4@ > 2630.0 // место, где внеш.поезд заедет на 2-путку
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18633 // set traffic light color to red - если появился встречный поезд, включаем красный светофор
end
else
if
4@ > 2630.0 // место, где внеш.поезд заедет на 2-путку
then
21@ = 18632 // set traffic light color to green
else
21@ = 18633 // set traffic light color to red - если появился встречный поезд, включаем красный светофор
end
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,3@,4@,6@)
else
3@ = 5000.0 // такое число сугубо для технической надобности
4@ = 0.0
end
if or
1@ > 2507.032// train position
3@ < 2250.0 // чтобы светофор был красным при появлении внутр. поезда и до прохождения им стрелки на разъезд перед туннелем
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,3@,4@,6@)
else
3@ = 5000.0 // такое число сугубо для технической надобности
4@ = 0.0
end
if
33@ < 30000
then
if
3@ > 2250.0 // место, где внутр.поезд заедет на 2-путку
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18633 // set traffic light color to red - если появился встречный поезд, включаем красный светофор
end
else
if
3@ > 2250.0 // место, где внутр.поезд заедет на 2-путку
then
22@ = 18632 // set traffic light color to green
else
22@ = 18633 // set traffic light color to red - если появился встречный поезд, включаем красный светофор
end
end
end
0@ = 2545.4644
1@ = 2489.8071
2@ = 9.8203
28@ = 0.0
3@ = 2555.9687
4@ = 2507.032
6@ = 9.8203
29@ = 180.0
jump @lights_1
end
if
20@ == 3
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
1@ < 1226.0918// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,3@,4@,6@)
else
3@ = 0.0
4@ = 0.0
end
if or
1@ > 1341.5892// train position
4@ > 1870.0 // чтобы светофор был красным до прохождения внутр.поездом стрелки
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,3@,4@,6@)
else
3@ = 0.0
4@ = 0.0
end
if
33@ < 30000 // если поезд не существует и с момента исчезновения последнего поезда прошло менее 30000 мс (30 сек)
// то будет назначен желтый сигнал
then
if
4@ < 1870.0
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18633 // set traffic light color to red - пока встречный внутр.поезд не заедет на 2-путку,
end // светофор на станции Линден красный
else
if
4@ < 1870.0
then
22@ = 18632 // set traffic light color to green
else
22@ = 18633 // set traffic light color to red - пока встречный внутр.поезд не заедет на 2-путку,
end // светофор на станции Линден красный
end
end
0@ = 2861.7556
1@ = 1226.0918
2@ = 9.8203
28@ = 0.0
3@ = 2871.428
4@ = 1341.5892
6@ = 9.8203
29@ = 180.0
jump @lights_1
end
if // остальные светофоры находятся на 2-путном участке, их режим работы остается как был
20@ == 4
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
1@ < 208.3398// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
1@ > 228.1062// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = 2790.0676
1@ = 208.3398
2@ = 10.4456
28@ = 17.1433
3@ = 2793.0969
4@ = 228.1062
6@ = 9.3835
29@ = 197.625
jump @lights_1
end
if
20@ == 5
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if and
0@ < 2274.7961// train position
1@ > -481.795
then
21@ = 18633 // set traffic light color to red
else
if
1@ < -481.795
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if and
1@ > -481.795// train position
0@ > 2294.8137
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = 2274.7961
1@ = -332.2822
2@ = 37.0372
28@ = 298.171
3@ = 2294.8137
4@ = -331.2238
6@ = 34.7746
29@ = 122.6793
jump @lights_1
end
if
20@ == 6
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
1@ < -1060.2272// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
1@ > -1042.8805// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = 2281.8567
1@ = -1060.2272
2@ = 25.8661
28@ = 0.0
3@ = 2292.123
4@ = -1042.8805
6@ = 25.8325
29@ = 180.0
jump @lights_1
end
if
20@ == 7
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
0@ < 1910.3224// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
0@ > 1928.194// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = 1910.3224
1@ = -1950.7422
2@ = 12.5547
28@ = 270.0
3@ = 1928.194
4@ = -1961.0897
6@ = 12.5469
29@ = 90.0
jump @lights_1
end
if
20@ == 8
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
0@ < -30.3923// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
0@ > -12.0904// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = -30.3923
1@ = -1014.865
2@ = 19.3695
28@ = 270.0
3@ = -12.0904
4@ = -1025.2236
6@ = 19.7471
29@ = 90.0
jump @lights_1
end
if
20@ == 9
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
0@ < -1268.5348// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
0@ > -1252.0717// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = -1268.5348
1@ = -1509.6836
2@ = 25.4872
28@ = 265.262
3@ = -1252.0717
4@ = -1521.1899
6@ = 27.1844
29@ = 86.347
jump @lights_1
end
if
20@ == 10
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
1@ > 206.1199// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
1@ < 61.969// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = -1936.4524
1@ = 206.1199
2@ = 24.5516
28@ = 180.0
3@ = -1951.3076
4@ = 61.969
6@ = 24.7109
29@ = 0.0
jump @lights_1
end
if
20@ == 11
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
0@ > -905.1539// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
0@ < -925.2382// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = -905.1539
1@ = 1014.1198
2@ = 33.5781
28@ = 125.4259
3@ = -925.2382
4@ = 1011.7167
6@ = 33.5781
29@ = 305.5475
jump @lights_1
end
if
20@ == 12
then
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
0@ > 163.6387// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
0@ < 150.1235// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = 163.6387
1@ = 1257.507
2@ = 21.837
28@ = 69.524
3@ = 150.1235
4@ = 1273.7073
6@ = 21.6341
29@ = 248.1258
jump @lights_1
end
if
056E: car 8@ defined // внутр.поезд существует
then
car.StorePos(8@,0@,1@,2@)
if
1@ > 2002.6312// train position
then
21@ = 18633 // set traffic light color to red
else
21@ = 18632 // set traffic light color to green
end
else
if
32@ < 30000
then
21@ = 18631 // set traffic light color to yellow
else
21@ = 18632 // set traffic light color to green
end
end
if
056E: car 9@ defined // внеш.поезд существует
then
car.StorePos(9@,0@,1@,2@)
if
1@ < 1985.515// train position
then
22@ = 18633 // set traffic light color to red
else
22@ = 18632 // set traffic light color to green
end
else
if
33@ < 30000
then
22@ = 18631 // set traffic light color to yellow
else
22@ = 18632 // set traffic light color to green
end
end
0@ = 744.1491
1@ = 2002.6312
2@ = 4.7541
28@ = 180.0
3@ = 733.924
4@ = 1985.515
6@ = 4.3359
29@ = 0.0
:lights_1 // ------------------------------------------------------------------------------------создание или замена мачтовых светофоров
23@ = -382079 // place of traffic lights - в этой общедоступной ячейке памяти сохранен для сравнения номер точки мачтовых светофоров
24@ = -382078 // colour of traffic light 1 - в этой общедоступной ячейке памяти сохранен для сравнения цвет внутр.мачт. светофора
if and
003B: 20@ == &0(23@,1i) // (int)
003B: 21@ == &0(24@,1i) // (int)
then
else // если новый цвет или место установки внутр. светофора не соответствует старому, то
model.Load(21@)
repeat
wait 0
until model.Available(21@)
if
03CA: object 26@ exists // если существует старый внутренний светофор,
then
0108: destroy_object 26@ // то сначала удаляем его
end
object.Create(26@,21@,0@,1@,2@) // создаем внутренний светофор
0177: set_object 26@ Z_angle_to 28@
model.Destroy(21@)

{ marker.CreateAboveObject(7@ 26@)
if
21@ == 18631
then
marker.SetColor(7@ 0xFFFF00FF)
else
if
21@ == 18632
then
marker.SetColor(7@ 0x00FF00FF)
else
marker.SetColor(7@ 0xFF0000FF)
end
end
018B: set_marker 7@ radar_mode 2 }

0085: &0(24@,1i) = 21@ // (int) // сохраняем цвет светофора в памяти для сравнения
end
24@ = -382077 // colour of traffic light 4 - цвет внешнего светофора
if and
003B: 20@ == &0(23@,1i) // (int) - номер точки тот же
003B: 22@ == &0(24@,1i) // (int)
then
else // операции внешних светофоров аналогичны вышеприведенным
model.Load(22@)
repeat
wait 0
until model.Available(22@)
if
03CA: object 27@ exists
then
0108: destroy_object 27@
end
object.Create(27@,22@,3@,4@,6@)
0177: set_object 27@ Z_angle_to 29@
model.Destroy(22@)

{ marker.CreateAboveObject(7@ 27@)
if
22@ == 18631
then
marker.SetColor(7@ 0xFFFF00FF)
else
if
22@ == 18632
then
marker.SetColor(7@ 0x00FF00FF)
else
marker.SetColor(7@ 0xFF0000FF)
end
end
018B: set_marker 7@ radar_mode 2 }

0085: &0(23@,1i) = 20@ // (int) save new parameters in memory
0085: &0(24@,1i) = 22@ // (int)
end // Конец мачтовых светофоров
//-------------------------------------------------------------------------------------алгоритм торможения внутреннего поезда на станции
056E: car 8@ defined // если поезд существует
jf @_7
if and
18@ == 2 // имеет подходящий статус
30@ == 1 // и в кабине бот
jf @_7
car.StorePos(8@,3@,4@,6@) // тогда определяем позицию поезда и последовательно вычисляем расстояния до точек торможения на станциях
0509: 2@ = distance_between_XY 1474.9031 2634.6375 and_XY 3@ 4@ // 1474.9031 2634.6375 - точка на какой-то станции
if and
0025: 12@ > 2@ // (float) если поезд достаточно близко к точке торможения
0025: 2@ > 11@ // (float) но не слишком близко (иначе не успеет затормозить на станции)
3@ < 1474.9031 // смысл этого условия следующий
// предположим, поезд приближается к станции по направлению юг-север. Тогда, если Y координата поезда меньше Y координаты точки остановки,
// то это значит, что поезд подъезжает к станции, а не отъезжает от неё - можно включить торможение
then
06DD: set_train 8@ speed 0.0 // включаем торможение
18@ = 3 // присваиваем новый статус
jump @_7 // выходим из данной секции
end
0509: 2@ = distance_between_XY 2866.8667 1246.4919 and_XY 3@ 4@ //
if and
0025: 12@ > 2@ // (float)
0025: 2@ > 11@ // (float)
4@ > 1246.4919
then
06DD: set_train 8@ speed 0.0
18@ = 3
jump @_7
end
0509: 2@ = distance_between_XY 1696.873 -1955.7689 and_XY 3@ 4@
if and
0025: 12@ > 2@ // (float)
0025: 2@ > 11@ // (float)
3@ > 1696.873
then
06DD: set_train 8@ speed 0.0
18@ = 3
jump @_7
end
0509: 2@ = distance_between_XY 784.326 -1341.736 and_XY 3@ 4@ // рынок 821.194 -1364.7119 -0.4794
if and
0025: 12@ > 2@ // (float)
0025: 2@ > 11@ // (float)
3@ > 784.326
then
06DD: set_train 8@ speed 0.0
18@ = 3
jump @_7
end
0509: 2@ = distance_between_XY -1943.7788 183.2991 and_XY 3@ 4@
if and
0025: 12@ > 2@ // (float)
0025: 2@ > 11@ // (float)
4@ < 183.2991
then
06DD: set_train 8@ speed 0.0
18@ = 3
end
:_7
//---------------------------------------------------------------------------------------------------алгоритм торможения внешнего поезда
056E: car 9@ defined // команды те же, что и для внутреннего поезда
jf @_8
if and
19@ == 2
31@ == 1
jf @_8
car.StorePos(9@,3@,4@,6@)
0509: 2@ = distance_between_XY 1392.7462 2634.2546 and_XY 3@ 4@
if and
0025: 14@ > 2@ // (float)
0025: 2@ > 13@ // (float)
3@ > 1392.7462
then
06DD: set_train 9@ speed 0.0
19@ = 3
jump @_8
end
0509: 2@ = distance_between_XY 2867.2666 1330.1616 and_XY 3@ 4@
if and
0025: 14@ > 2@ // (float)
0025: 2@ > 13@ // (float)
4@ < 1330.1616
then
06DD: set_train 9@ speed 0.0
19@ = 3
jump @_8
end
0509: 2@ = distance_between_XY 1778.1157 -1955.7063 and_XY 3@ 4@
if and
0025: 14@ > 2@ // (float)
0025: 2@ > 13@ // (float)
3@ < 1778.1157
then
06DD: set_train 9@ speed 0.0
19@ = 3
jump @_8
end
0509: 2@ = distance_between_XY 841.0762 -1393.855 and_XY 3@ 4@
if and
0025: 14@ > 2@ // (float)
0025: 2@ > 13@ // (float)
3@ < 841.0762
then
06DD: set_train 9@ speed 0.0
19@ = 3
jump @_8
end
0509: 2@ = distance_between_XY -1946.4993 81.0843 and_XY 3@ 4@
if and
0025: 14@ > 2@ // (float)
0025: 2@ > 13@ // (float)
4@ > 81.0843
then
06DD: set_train 9@ speed 0.0
19@ = 3
end
:_8
if //-------------------------------------------------------------------------------------Назначение времени стоянки внутреннему поезду
056E: car 8@ defined
then
if and
18@ == 3
30@ == 1
01C1: car 8@ stopped
then
18@ = 4
0209: 16@ = random_int_in_ranges 15 21 // мин и макс время стоянки внутреннего поезда в секундах
16@ *= 1000
32@ = 0
end
end
if //-------------------------------------------------------------------------------------Назначение времени стоянки внешнему поезду
056E: car 9@ defined
then
if and
19@ == 3
31@ == 1
01C1: car 9@ stopped
then
19@ = 4
0209: 17@ = random_int_in_ranges 15 21 // мин и макс время стоянки внешнего поезда в секундах
17@ *= 1000
33@ = 0
end
end
if //---------------------------------------------------------------------------------------Отправление внутреннего поезда со станции
056E: car 8@ defined
then
car.StorePos(8@,0@,1@,2@)
if
056E: car 9@ defined // если внешний поезд существует (актуально на станции Йеллоубелл)
then
car.StorePos(9@,3@,4@,6@)
else
3@ = 0.0
4@ = 0.0
end
if 1@ < 2620.0 // Йеллоубелл - самая северная станция, эта координата показатель, что внутр.поезд находится там
then
if and
18@ == 4
30@ == 1
001D: 32@ > 16@ // (int) - время стоянки истекло
then
18@ = 2
06DD: set_train 8@ speed 33.33 // отправление со всех остальных станций
end
else
if and
18@ == 4
30@ == 1
001D: 32@ > 16@ // (int) - время стоянки истекло
3@ < 1425.0 // отправление с Йеллоубелл: если внеш.поезд существует и не покинул однопутку, внутр.поезд ожидает
then // для красного светофора условия аналогичные, поезд поедет только на зеленый
18@ = 2
06DD: set_train 8@ speed 33.33 // отправление с Йеллоубелл
end
end

end
if //-------------------------------------------------------------------------------------------Отправление внешнего поезда со станции
056E: car 9@ defined
then
car.StorePos(9@,0@,1@,2@)
if
056E: car 8@ defined
then
car.StorePos(8@,3@,4@,6@)
else
3@ = 0.0
4@ = 0.0
end
if 0@ < 2850.0 // Линден - самая восточная станция, эта координата показатель, что внеш.поезд находится там
then
if and
19@ == 4
31@ == 1
001D: 33@ > 17@ // (int) - время стоянки истекло
then
19@ = 2
06DD: set_train 9@ speed 33.33 // отправление со всех остальных станций
end
else
if and
19@ == 4
31@ == 1
001D: 33@ > 17@ // (int) - время стоянки истекло
4@ < 1865.0 // отправление с Линден: если внутр.поезд существует и не покинул однопутку, внеш.поезд ожидает
then // для красного светофора условия аналогичные, поезд поедет только на зеленый
19@ = 2
06DD: set_train 9@ speed 33.33 // отправление с Линден
end
end

end
if //---------------------------------------------------------------------------------------вход игрока в локомотив внутреннего поезда
056E: car 8@ defined
then
if and
not actor.InCar($PLAYER_ACTOR,8@)
0203: actor $PLAYER_ACTOR near_car 8@ radius 8.0 8.0 flag 0 on_foot
00E1: player 0 pressed_key 15
then
05CB: AS_actor $PLAYER_ACTOR enter_car 8@ as_driver -1 ms
end
end
if //-------------------------------------------------------------------------------------------вход игрока в локомотив внешнего поезда
056E: car 9@ defined
then
if and
not actor.InCar($PLAYER_ACTOR,9@)
0203: actor $PLAYER_ACTOR near_car 9@ radius 8.0 8.0 flag 0 on_foot
00E1: player 0 pressed_key 15
then
05CB: AS_actor $PLAYER_ACTOR enter_car 9@ as_driver -1 ms
end
end
if //------------------------------------------------------------------------------------ отключение автоведения для внутреннего поезда
056E: car 8@ defined
then
if and
30@ == 1
actor.InCar($PLAYER_ACTOR,8@)
09AE: actor $PLAYER_ACTOR driving_train // проверка на случай, если игрок является пассажиром поезда
then
30@ = 0
06DD: set_train 8@ speed 0.0 // чтобы поезд не уехал сам, когда игрок выйдет из кабины
end
end
if //---------------------------------------------------------------------------------------- отключение автоведения для внешнего поезда
056E: car 9@ defined
then
if and
31@ == 1
actor.InCar($PLAYER_ACTOR,9@)
09AE: actor $PLAYER_ACTOR driving_train // проверка на случай, если игрок является пассажиром поезда
then
31@ = 0
06DD: set_train 9@ speed 0.0 // чтобы поезд не уехал сам, когда игрок выйдет из кабины
end
end
if //--------------------------------------------------------------------------------------------------------удаление внутреннего поезда
056E: car 8@ defined
then
actor.StorePos($PLAYER_ACTOR,0@,1@,6@)
car.StorePos(8@,3@,4@,6@)
0509: 2@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if
2@ > 700.0 // если поезд удалился от игрока более, чем на 700 м
then
07BD: destroy_train 8@ // то удаляем поезд
30@ = 0
18@ = 0
end
end
if //-----------------------------------------------------------------------------------------------------------удаление внешнего поезда
056E: car 9@ defined
then
actor.StorePos($PLAYER_ACTOR,0@,1@,6@)
car.StorePos(9@,3@,4@,6@)
0509: 2@ = distance_between_XY 0@ 1@ and_XY 3@ 4@
if and
0@ > 900.0 // если игрок в районе однопутных участков
1@ > 2000.0
then
if or
0025: 3@ > 0@ // условия, при которых поезд можно считать удаляющимся от игрока и удалять, если расстояние станет больше 700 м
3@ > 2430.0
then
if
2@ > 1400.0 // если поезд создался на большом расстоянии от игрока
then // (подходящее место на двухпутке может быть намного дальше 700м), чтобы сразу же не исчез
07BD: destroy_train 9@
31@ = 0
19@ = 0
end
else
if
2@ > 700.0 // если поезд удалился от игрока более, чем на 700 м
then
07BD: destroy_train 9@ // то удаляем поезд
31@ = 0
19@ = 0
end
end
else
if
2@ > 700.0 // если поезд удалился от игрока более, чем на 700 м
then
07BD: destroy_train 9@ // то удаляем поезд
31@ = 0
19@ = 0
end
end
end
if //------------------------------------------------------------------запись указателя на внутренний поезд в общедоступную ячейку памяти
056E: car 8@ defined
then
7@ = -382076
0085: &0(7@,1i) = 8@ // (int) - записываем в память указатель на поезд для синхронизации с другими ж д скриптами
end
if //---------------------------------------------------------------------запись указателя на внешний поезд в общедоступную ячейку памяти
056E: car 9@ defined
then
7@ = -382075
0085: &0(7@,1i) = 9@ // (int) - записываем в память указатель на поезд для синхронизации с другими ж д скриптами
end
end

 


Настройки файлов tllgs.ide, gta.dat, tracks2.dat, tracks4.dat и модели светофоров можно использовать с оригинального скрипта.

Изменено пользователем Synthwave85
Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

очень интересно. А пассажиры тоже выходят на станциях как в оригинальной игре?

Ссылка на комментарий
Поделиться на другие сайты

А пассажиры тоже выходят на станциях как в оригинальной игре?

Увы, этого сделать не удалось и не знаю как :( Еще, зайти в вагон и выйти из него можно только с правой по ходу движения стороны, слева Карл не хочет заходить и выходить :). Причем почему-то само так получилось, я специально не пытался. Но так даже лучше, зачем выходить на рельсы?

 

 

[spoiler=код]// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013

{$CLEO .cs}

 

//-------------MAIN---------------

thread "PASSASHIR"

 

:PASSASHIR_1

wait 0

if

Player.Defined($PLAYER_CHAR)

else_jump @PASSASHIR_1

 

:PASSASHIR_2

0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to 1@

wait 0

if and

056E: car 0@ defined

not actor.InCar($PLAYER_ACTOR,0@)

0AB0: key_pressed 13

else_jump @PASSASHIR_2

wait 0

if

Car.Model(0@) == #STREAKC

else_jump @PASSASHIR_2

wait 0

if or

0431: car 0@ passenger_seat_free 0

0431: car 0@ passenger_seat_free 1

0431: car 0@ passenger_seat_free 2

else_jump @PASSASHIR_2

05CA: AS_actor $PLAYER_ACTOR enter_car 0@ passenger_seat -1 time 10000

jump @PASSASHIR_2

 

 

Если есть дополнительные вагоны на дополнительных ID, то после строчки Car.Model(0@) == #STREAKC пишем такую же, только вместо #STREAKC номер ID дополнительного вагона, а строчкой выше после if пишем or

Ссылка на комментарий
Поделиться на другие сайты

Удалось даже заставить Карла садиться в спальный вагон и ресторан, которые конвертировал Driver:

 

SA_CZ_CoachDorm-1s.jpg

 

SA_CZ_LoungeCafe-1s.jpg

 

Но поскольку там нет dummy для пассажирских мест, он просто висит в воздухе между этажами. И двери тоже открываются некрасиво.

 

Поэтому, если Driver сам захочет, или кто-то еще сумеет (я не умею, пробовал открыть их в zmodeler и добавить дамми, но когда сохранил, то в игре получилась полная лажа - окна стали непрозрачные и цвет самого вагона темнее), было бы неплохо добавить для этих вагонов дамми пассажиров и адаптировать их двери под скрипт для степвэна.

 

Кстати, немного изменил handling для Driver'овских локомотивов и вагонов, чтобы колеса на рельсах реалистичнее смотрелись, с оригинальными настройками немного в землю проваливались. Ну и чтобы Карл мог заходить в доп. пассажирские вагоны, у которых handling от грузовых. Впрочем, эти настройки рекомендую только со скриптом "новый алгоритм движения поездов", иначе Карл сможет по нажатию клавиши садиться в грузовую платформу.

 

[spoiler=handling]FREIGHT 5500.0 65000.0 3.0 0.0 0.0 0.0 90 0.58 0.8 0.5 4 110.0 20.0 20.0 R D 03.17 0.40 0 30.0 1.4 0.06 0.0 0.45 0.20 0.55 0.0 0.45 0.20 5000 8 200 0 1 2
STREAK 5500.0 65000.0 3.0 0.0 0.0 0.0 90 0.58 0.8 0.5 4 110.0 20.0 20.0 R D 03.17 0.40 0 30.0 1.4 0.06 0.0 0.45 0.10 0.55 0.0 0.65 0.20 5000 8 200 0 1 2

FREIFLAT 5500.0 33187.9 1.0 0.0 0.0 0.0 90 0.58 0.8 0.5 4 110.0 20.0 20.0 R D 03.17 0.40 0 30.0 1.4 0.06 0.0 0.45 0.20 0.55 0.0 0.65 0.20 5000 8 200 0 1 21
CSTREAK 5500.0 33187.9 1.0 0.0 0.0 0.0 90 0.58 0.8 0.5 4 110.0 20.0 20.0 R D 03.17 0.40 0 30.0 1.4 0.06 0.0 0.45 0.10 0.55 0.0 0.65 0.20 5000 8 200 0 1 21

 

Изменено пользователем Synthwave85
Ссылка на комментарий
Поделиться на другие сайты

Удалось даже заставить Карла садиться в спальный вагон и ресторан, которые конвертировал Driver:

Driver писал, что он уже закончил c GTA San Andreas.

Плохо, что люди не понимают, что для того чтобы получить хорошую модель для игру нужно взять стандартную модель и просто переработать её в качественную. А то лепят разные поезда и получается, что кроме красивой графики ничего больше нет (посадка через стенку, компоненты не работают и т. п.).

Изменено пользователем Dimoman_93
Ссылка на комментарий
Поделиться на другие сайты

Доброго времени суток. Давненько не было. В общем заработал скрипт. Но пока только  с одним пикапом. После взятия пикапа, маркер удаляется, как и должно быть, да и после загрузки сохранения маркеры не отрисовываются по новой. Теперь у меня вопрос - как это все размножить на 25 пикапов? Чтобы все было более компактно и культурно.  Хотя можно еще будет потестить "gosub", что при условии, когда все пикапы взяты сразу же завершался поток без дальнейших проверок. [spoiler=Скрипт]{$CLEO .cs}

thread 'Oysters 1-32'
:OY_1
wait 0
if
048C: pickup_at 155.0 -1975.0 -8.0 available_to_be_picked_up
jf @OY_1
else_jump @END_THREAD
1@ = Marker.CreateIconWithoutSphere(21, 155.0, -1975.0, -8.0)

:DELOY_1
wait 0
if
pickup.Picked_up($2992)
jf @DELOY_1
Marker.Disable(1@)
1@ = 0

:END_THREAD
wait 0
if
1@ == 0
then
end_thread
else_jump @DELOY_1
end

 

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

И есть в природе скрипт, который сохраняет авто в указанной точке перед некоторыми миссиями, к которым можно приехать на своем затюненом спорткаре? Чтобы после окончания миссии Карл мог сесть в свое же авто, на котором приехал и уехать в закат. Нашел две альтернативы (Save My Car от Sanjay Vig - сохранение по нажатию F7; Car Save от Trushin Vlad - сохраняет последнее авто, в котором сидел Карл. Работают по другому принципу, но надо попробовать. 

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

   Всем привет. В общем я встал в тупик. Нужен опкод, который не будет сохранять маркеры при сохранении игры. Как к примеру эти опкоды 014B: (если вызвать авто, то оно сохранится в игре на всегда) и 00A5: (если удалим скрипт то, даже на сохраненных, с включенным скриптом, играх, этого автомобиля уже не будет). Может кто знает как это реализовать с иконками на карте.  

Работа скрипта на сегодняшний день.

 

 

Важный момент:

обязательно добавляем команду 0A95: enable_thread_saving, иначе после добавления иконки и перезагрузке игры иконка останется и удалить ее будет проблематично. 

 

   Потестил на добавлении одной иконки без других условий. Пишем скрипт на добавление иконки с 0A95: в начале. Завершаем поток 0А93:. Загружаем игру. Иконка нарисовалась. Скрипт завершился. Сохраняем. Выходим. Удаляем скрипт. Загружаем сохранение, а иконка наша осталась на месте. Т.е. получается, что опкод 0А95: не сработал.

   Перечитал посты. Понял, что все таки 0А95: тут  не при чем.  Значит перед сохранением игры надо чтобы скрипт удалял созданные маркеры.  К примеру если CJ находится в интерьере, где есть дискетка, или приходит на точку сохранения, которая вне дома то скрипт должен удалить маркеры. Ну и соответственно свою работу скрипт должен начинать лишь поле того как пройду проверки на то, что СиДжей не в доме сохранения и не возле точки сохранения. Вопрос. Есть у кого координаты всех сохранений, которые вне дома. По моему это в доме Торето или как его там; второе гараж в Догерти, Сан Фиеро. Поправьте, если забыл, что-то. Завтра буду переписывать скрипт. 

   Проверил на нескольких иконках но с одним домом, где имеется сохранение. Вроде все норм. Иконки удаляются, когда мы входим в дом - соответственно не сохраняются на карте при сохранении игры.

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

И так, думаю, большая часть готова. Теперь скрипт никак не влияет на сохранения. Т.е. поток отрисовал иконки, мы пошли сохранятся,а он их в это время удалил. И если мы удалим скрипт и загрузим наше сохранение, то иконок не будет в отличии от прошлой версии. Если есть у кого возможность проверить, что не так. А куда теперь пихнуть условие удаления маркера, при взятии пикапа. 

[spoiler=Скрипт]

{$CLEO .cs}

0000: NOP

:NONAME_0
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @NONAME_0
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @NONAME_0
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0
then
jump @NONAME_0
else
0004: 3@ = 0
gosub @NONAME_3
jump @NONAME_1
end

:NONAME_1
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @NONAME_2
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @NONAME_2
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0
then
gosub @NONAME_3
jump @NONAME_2
else
gosub @NONAME_3
jump @NONAME_1
end

:NONAME_2
wait 0
if
3@ == 1
jf @NONAME_0
Marker.Disable(0@)
Marker.Disable(1@)
Marker.Disable(2@)
0004: 3@ = 0
jump @NONAME_0

:NONAME_3
wait 0
    if
    3@ == 1
    then
    return
    end
if 
    048C: pickup_at 155.0 -1975.0 -8.0 available_to_be_picked_up
    then
    0@ = Marker.CreateIconWithoutSphere(56, 155.0, -1975.0, -8.0)
    end
if
    048C: pickup_at 725.0 -1849.0 -5.0 available_to_be_picked_up 
    then
    1@ = Marker.CreateIconWithoutSphere(56, 725.0, -1849.0, -5.0)
    end
if
    048C: pickup_at 723.0 -1586.0 -3.0 available_to_be_picked_up
    then
    2@ = Marker.CreateIconWithoutSphere(56, 723.0, -1586.0, -3.0)
    end 
0004: 3@ = 1
return

if
    3@ == 1
    then
    Marker.Disable(0@)
    Marker.Disable(1@)
    Marker.Disable(2@)
    0004: 3@ = 0
    return
else
    return
end 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Всем привет. Новая проверка на взятие всех пикапов. И завершение скрипта, если все собраны. Т.е. строки 1@ == 0 и т.д. уже не будут нужны, код будет намного компактнее. И возник еще один вопрос, а нельзя ли написать скрипт в формате *.cm? Так как локальных переменных там можно использовать больше 1000 и не придется делить его на 2 части, при использовании больше 32 переменных.

 [spoiler=Проверка]

{$CLEO}
0000:

:OYSTERS
thread 'OYSTERS'
wait 0
if 
Player.Defined($PLAYER_CHAR) // Проверка на существование игрока
jf @OYSTERS_1

:OYSTERS_1
wait 0
0A8D: 0@ = read_memory 0xB791EC size 4 virtual_protect 1 // В переменную 0@ будет записано количество найденных ракушек

if  
0@ == 50
then
jump @OYSTERS_2
else
jump @OYSTERS_1
end

:OYSTERS_2
wait 0
0A93: end_custom_thread // Удаляем скрипт из памяти 

 

 

Ссылка на комментарий
Поделиться на другие сайты

И снова здравствуйте. Я тут, походу, сам с собой уже веду беседу. Ну да ладно. В общем-то все. Все проблемы с работой скрипта решены. Осталось лишь добавить оставшиеся 48 пикапов. В связи с этим хотел поинтересоваться почему не рекомендуется использовать глобальные переменные в формате $OBJ, просто выбрав имя которое не встречается в main.csm. (Ответ: http://sannybuilder.com/forums/viewtopic.php?pid=3747#p3747)  Или использовать глобальные переменные с помощью опкода 0AB3: var 0 Marker.CreateIconWithoutSphere (x.y.z)? Но тогда возможны проблемы с другими скриптами, использующие те же переменные, что и в моем потоке. 

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

В связи с этим хотел поинтересоваться почему не рекомендуется использовать глобальные переменные в формате $OBJ, просто выбрав имя которое не встречается в main.csm.  

Справка Sanny Builder->CLEO 3 Code Library->FAQ по CLEO 3->Почему в CLEO-скриптах нельзя использовать глобальные переменные

Ссылка на комментарий
Поделиться на другие сайты

Справка Sanny Builder->CLEO 3 Code Library->FAQ по CLEO 3->Почему в CLEO-скриптах нельзя использовать глобальные переменные

Это уже выяснил. Второй вопрос тоже не решает моей проблемы. А с выделением памяти я пока не разобрался.

Ссылка на комментарий
Поделиться на другие сайты

Народ, ЧП. Срочно нужен ответ -  почему после 28 вложенных друг в друга условий на 29 условии компилятор выдает ошибку "Невозможно выполнить переход к метке. Внутренняя метка не найдена. Проверьте ваши высокоуровневые конструкции. Некоторые из них не имеют закрывающего "end"." Сначала прописал 51 условие, а потом скомпилировал и сани выдал ту же ошибку, вот и стал разбираться, считать количество end, проверять условия. Ошибок не нашёл, кроме той, что забыл переменную переназначить, но это уже другой разговор. Вообщем вынес все эти условия в отдельный текстовик и начал постепенно оттуда копировать и вставлять. В итоге и наткнулся на ошибку именно на 29 вложенном условии. Почитал справку, ничего такого типа лимита подусловий не нашел. В чем тогда может быть проблема? При чем если просто условия друг за другом идут, то там все равно (у меня их около 52), никаких ошибок при компиляции. 

Ссылка на комментарий
Поделиться на другие сайты

Ни прошло и дня, как появился новый вопрос. И радостная новость идея скрипта воплощена в жизнь и уже есть 2 версии. В первой версии иконки появляются одна за другой, по мере взятия пикапов. Во второй версии отрисовываются сразу все иконки к существующим пикапам (из-за ограничения в 32 переменные скрипт поделен на 2 части), но лимит иконок на карте равен 175, и если у вас, на пример, отображается уже 150 иконок, то скрипт нарисует лишь 25, а следующие будут отрисовываться по мере удаления предыдущих, но только после сохранения игры. Ну или как альтернатива - использовать какой-либо limit adjuster, в котором взломан лимит на максимальное количество отображаемых иконок, и увеличить его сразу на 50. Есть как бы и третья, но вот с ней как раз таки и связан вопрос. Суть третьей версии в том, что в отличие от второй версии в памяти игры не будет висеть одновременно два потока. Т.е. сначала будет отрисована первая часть маркеров на карте (23 штуки), и после того как игрок соберет 23 пикапа и удалятся соответствующие маркеры, тогда запуститься второй поток с помощью опкода "0A92: create_custom_thread" и на карте будет отрисовано, оставшиеся 27 маркеров. Но пока по каким-то причинам после того как мы удалили 23 маркера, вторая часть не стартует. Кстати все 3 версии не сохраняют маркеры на карте, при сохранении игры. Т.е. все ваши сохранения останутся нетронутыми и даже после удаления скрипта с уже отрисованными маркерами, они вас больше не потревожат. Выкладываю сразу все 3 версии, вдруг будут какие-то замечания по первым двум.

Так пока это все вставлял в 3ей версии нашел несоответствие, что когда запускается новый поток, первый должен завершиться. 

[spoiler=1_Версия]

{$CLEO .cs}

0000: NOP
thread 'OYSTERS'
:OYSTERS_1
wait 10
if
Player.Defined($PLAYER_CHAR)
jf @OYSTERS_1
0A8D: 0@ = read_memory 0xB791EC size 4 virtual_protect 1 // В переменную 0@ будет записано количество найденных ракушек
if
0@ == 50
then
jump @OYSTERS_5
end
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @OYSTERS_1
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)
then
jump @OYSTERS_1
else   
    if  // пошли условия создания маркеров на карте
    048C: pickup_at 1968.0 -1203.0 17.0 available_to_be_picked_up // $2993 
    then
    1@ = Marker.CreateIconWithoutSphere(56, 1968.0, -1203.0, 17.0)
    else
        if // если не существует пикапа $2993 то идет проверка на существование следующего пикапа $2984, и если есть таковой - рисуем маркер на карте
        048C: pickup_at 1279.0 -806.0 85.0 available_to_be_picked_up // $2984
        then 
        1@ = Marker.CreateIconWithoutSphere(56, 1279.0, -806.0, 85.0)
        else
            if // а если не существует пикапа $2984 то проверяем существование $2985 и последующей отрисовки маркера на карте. Ну и т.д. 
            048C: pickup_at 2945.13 -2051.93 -3.0 available_to_be_picked_up // $2985
            then
            1@ = Marker.CreateIconWithoutSphere(56, 2945.13, -2051.93, -3.0)
            else
                if
                048C: pickup_at 2750.0 -2584.0 -5.0 available_to_be_picked_up // $2983
                then
                1@ = Marker.CreateIconWithoutSphere(56, 2750.0, -2584.0, -5.0)
                else
                    if 
                    048C: pickup_at 2621.0 -2506.0 -5.0 available_to_be_picked_up // $2988
                    then
                    1@ = Marker.CreateIconWithoutSphere(56, 2621.0, -2506.0, -5.0)
                    else
                        if                                                                    
                        048C: pickup_at 2327.0 -2662.0 -5.0 available_to_be_picked_up // $2987
                        then                                                                  
                        1@ = Marker.CreateIconWithoutSphere(56, 2327.0, -2662.0, -5.0)        
                        else
                            if                                                                    
                            048C: pickup_at 1249.0 -2687.0 -1.0 available_to_be_picked_up // $2989
                            then                                                                  
                            1@ = Marker.CreateIconWithoutSphere(56, 1249.0, -2687.0, -1.0)        
                            else
                                if                                                                       
                                048C: pickup_at 979.0 -2210.0 -3.0 available_to_be_picked_up // $2982
                                then                                                                 
                                1@ = Marker.CreateIconWithoutSphere(56, 979.0, -2210.0, -3.0)        
                                else
                                    if                                                                   
                                    048C: pickup_at 725.0 -1849.0 -5.0 available_to_be_picked_up // $2990
                                    then                                                                 
                                    1@ = Marker.CreateIconWithoutSphere(56, 725.0, -1849.0, -5.0)        
                                    else
                                        if                                                                   
                                        048C: pickup_at 723.0 -1586.0 -3.0 available_to_be_picked_up // $2991
                                        then                                                                 
                                        1@ = Marker.CreateIconWithoutSphere(56, 723.0, -1586.0, -3.0)       
                                        else
                                            if                                                                   
                                            048C: pickup_at 155.0 -1975.0 -8.0 available_to_be_picked_up // $2992
                                            then                                                                 
                                            1@ = Marker.CreateIconWithoutSphere(56, 155.0, -1975.0, -8.0)       
                                            else
                                                if                                                                  
                                                048C: pickup_at 2767.0 470.0 -8.0 available_to_be_picked_up // $3024
                                                then                                                                
                                                1@ = Marker.CreateIconWithoutSphere(56, 2767.0, 470.0, -8.0)       
                                                else
                                                    if                                                                  
                                                    048C: pickup_at 2179.0 235.0 -5.0 available_to_be_picked_up // $3031
                                                    then                                                                
                                                    1@ = Marker.CreateIconWithoutSphere(56, 2179.0, 235.0, -5.0)       
                                                    else
                                                        if                                                                   
                                                        048C: pickup_at 2098.0 -108.0 -2.0 available_to_be_picked_up // $3023
                                                        then                                                                 
                                                        1@ = Marker.CreateIconWithoutSphere(56, 2098.0, -108.0, -2.0)       
                                                        else
                                                            if                                                                  
                                                            048C: pickup_at 486.0 -253.0 -4.0 available_to_be_picked_up // $3010
                                                            then                                                                
                                                            1@ = Marker.CreateIconWithoutSphere(56, 486.0, -253.0, -4.0)       
                                                            else
                                                                if                                                                 
                                                                048C: pickup_at 40.0 -531.0 -8.0 available_to_be_picked_up // $3021
                                                                then                                                               
                                                                1@ = Marker.CreateIconWithoutSphere(56, 40.0, -531.0, -8.0)       
                                                                else
                                                                    if                                                                  
                                                                    048C: pickup_at -90.0 -910.0 -5.0 available_to_be_picked_up // $3011
                                                                    then                                                                
                                                                    1@ = Marker.CreateIconWithoutSphere(56, -90.0, -910.0, -5.0)       
                                                                    else
                                                                        if                                                                  
                                                                        048C: pickup_at 67.0 -1018.0 -5.0 available_to_be_picked_up // $2986
                                                                        then                                                                
                                                                        1@ = Marker.CreateIconWithoutSphere(56, 67.0, -1018.0, -5.0)       
                                                                        else
                                                                            if                                                                      
                                                                            048C: pickup_at 26.43 -1320.94 -10.04 available_to_be_picked_up // $3012
                                                                            then                                                                    
                                                                            1@ = Marker.CreateIconWithoutSphere(56, 26.43, -1320.94, -10.04)       
                                                                            else
                                                                                if                                                                    
                                                                                048C: pickup_at -207.0 -1682.0 -8.0 available_to_be_picked_up // $3013
                                                                                then                                                                  
                                                                                1@ = Marker.CreateIconWithoutSphere(56, -207.0, -1682.0, -8.0)       
                                                                                else
                                                                                    if                                                                     
                                                                                    048C: pickup_at -1097.0 -2858.0 -8.0 available_to_be_picked_up // $3016
                                                                                    then                                                                   
                                                                                    1@ = Marker.CreateIconWithoutSphere(56, -1097.0, -2858.0, -8.0)       
                                                                                    else
                                                                                        if                                                                     
                                                                                        048C: pickup_at -1175.0 -2639.0 -2.5 available_to_be_picked_up // $3015
                                                                                        then                                                                   
                                                                                        1@ = Marker.CreateIconWithoutSphere(56, -1175.0, -2639.0, -2.5)       
                                                                                        else
                                                                                            if                                                                                                              
                                                                                            048C: pickup_at -1672.0 -1641.0 -2.0 available_to_be_picked_up // $3014 - Последняя ракушка в округе Лос-Сантоса
                                                                                            then                                                                                                            
                                                                                            1@ = Marker.CreateIconWithoutSphere(56, -1672.0, -1641.0, -2.0)                                                
                                                                                            else
                                                                                                if                          
                                                                                                048C: pickup_at -2889.0 -1042.0 -9.0 available_to_be_picked_up // $3017
                                                                                                then                                                                   
                                                                                                1@ = Marker.CreateIconWithoutSphere(56, -2889.0, -1042.0, -9.0)        
                                                                                                else
                                                                                                    if                                                                    
                                                                                                    048C: pickup_at -2727.0 -469.0 -5.0 available_to_be_picked_up // $2999
                                                                                                    then                                                                  
                                                                                                    1@ = Marker.CreateIconWithoutSphere(56, -2727.0, -469.0, -5.0)        
                                                                                                    else
                                                                                                        if                                                                  
                                                                                                        048C: pickup_at -1625.0 4.0 -10.0 available_to_be_picked_up // $2996
                                                                                                        then                                                                
                                                                                                        1@ = Marker.CreateIconWithoutSphere(56, -1625.0, 4.0, -10.0)        
                                                                                                        else
                                                                                                            if                                                                   
                                                                                                            048C: pickup_at -1364.0 390.0 -5.0 available_to_be_picked_up // $3002
                                                                                                            then                                                                 
                                                                                                            1@ = Marker.CreateIconWithoutSphere(56, -1364.0, 390.0, -5.0) 
                                                                                                            else
                                                                                                                jump @OYSTERS_2 // прыгаем на следующую метку с условиями, т.к. SB выдавал ошибку, 
                                                                                                            end                 // когда пытался скомпилировать скрипт с более 28 подусловиями
                                                                                                        end
                                                                                                    end
                                                                                                end
                                                                                            end
                                                                                        end
                                                                                    end
                                                                                end
                                                                            end
                                                                        end
                                                                    end
                                                                end
                                                            end
                                                        end
                                                    end
                                                end
                                            end
                                        end
                                    end
                                end
                            end    
                        end
                    end
                end
            end
        end    
    end              
jump @OYSTERS_3    
end

:OYSTERS_2
wait 10
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @OYSTERS_1
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)
then
jump @OYSTERS_1
else
        if                                                                   
    048C: pickup_at -1252.0 501.0 -8.0 available_to_be_picked_up // $2995
    then                                                                 
    1@ = Marker.CreateIconWithoutSphere(56, -1252.0, 501.0, -8.0)        
    else
        if                                                                   
        048C: pickup_at -1013.0 478.0 -7.0 available_to_be_picked_up // $3001
        then                                                                 
        1@ = Marker.CreateIconWithoutSphere(56, -1013.0, 478.0, -7.0)        
        else
            if                                                                  
            048C: pickup_at -765.0 247.0 -8.0 available_to_be_picked_up // $3022
            then                                                                
            1@ = Marker.CreateIconWithoutSphere(56, -765.0, 247.0, -8.0)        
            else
                if                                                                    
                048C: pickup_at -1266.0 966.0 -10.0 available_to_be_picked_up // $3000
                then                                                                  
                1@ = Marker.CreateIconWithoutSphere(56, -1266.0, 966.0, -10.0)        
                else
                    if                                                                     
                    048C: pickup_at -1484.0 1489.0 -10.0 available_to_be_picked_up // $2997
                    then                                                                   
                    1@ = Marker.CreateIconWithoutSphere(56, -1484.0, 1489.0, -10.0)        
                    else
                        if                                                                             
                        048C: pickup_at -2505.406 1543.724 -22.5553 available_to_be_picked_up // $2998 
                        then                                                                           
                        1@ = Marker.CreateIconWithoutSphere(56, -2505.406, 1543.724, -22.5553)        
                        else
                            if                                                                    
                            048C: pickup_at -2657.0 1564.0 -6.0 available_to_be_picked_up // $2994
                            then                                                                  
                            1@ = Marker.CreateIconWithoutSphere(56, -2657.0, 1564.0, -6.0)       
                            else
                                if                                                                    
                                048C: pickup_at -2685.0 2153.0 -5.0 available_to_be_picked_up // $3029
                                then                                                                  
                                1@ = Marker.CreateIconWithoutSphere(56, -2685.0, 2153.0, -5.0)       
                                else
                                    if                                                                     
                                    048C: pickup_at -2110.5 2329.72 -7.5 available_to_be_picked_up // $3027
                                    then                                                                   
                                    1@ = Marker.CreateIconWithoutSphere(56, -2110.5, 2329.72, -7.5)       
                                    else
                                        if                                                                     
                                        048C: pickup_at -1538.0 1708.0 -3.27 available_to_be_picked_up // $3028
                                        then                                                                   
                                        1@ = Marker.CreateIconWithoutSphere(56, -1538.0, 1708.0, -3.27)       
                                        else
                                            if                                                                  
                                            048C: pickup_at -832.0 925.0 -2.0 available_to_be_picked_up // $3009
                                            then                                                                
                                            1@ = Marker.CreateIconWithoutSphere(56, -832.0, 925.0, -2.0)       
                                            else
                                                if                                                                  
                                                048C: pickup_at -659.0 874.0 -2.0 available_to_be_picked_up // $3018
                                                then                                                                
                                                1@ = Marker.CreateIconWithoutSphere(56, -659.0, 874.0, -2.0)       
                                                else
                                                    if                                                                   
                                                    048C: pickup_at -821.0 1374.0 -8.0 available_to_be_picked_up // $3026
                                                    then                                                                 
                                                    1@ = Marker.CreateIconWithoutSphere(56, -821.0, 1374.0, -8.0)       
                                                    else
                                                        if                                                                   
                                                        048C: pickup_at -783.0 2116.0 35.0 available_to_be_picked_up // $3025
                                                        then                                                                 
                                                        1@ = Marker.CreateIconWithoutSphere(56, -783.0, 2116.0, 35.0)       
                                                        else
                                                            if                                                                    
                                                            048C: pickup_at -1066.0 2197.0 32.0 available_to_be_picked_up // $3020
                                                            then                                                                  
                                                            1@ = Marker.CreateIconWithoutSphere(56, -1066.0, 2197.0, 32.0)       
                                                            else
                                                                if                                                                   
                                                                048C: pickup_at -955.0 2628.0 35.0 available_to_be_picked_up // $3019
                                                                then                                                                 
                                                                1@ = Marker.CreateIconWithoutSphere(56, -955.0, 2628.0, 35.0)       
                                                                else
                                                                    if                                                                  
                                                                    048C: pickup_at 796.0 2939.0 -5.0 available_to_be_picked_up // $3030
                                                                    then                                                                
                                                                    1@ = Marker.CreateIconWithoutSphere(56, 796.0, 2939.0, -5.0)       
                                                                    else
                                                                        if                                                                  
                                                                        048C: pickup_at 2130.0 1152.0 7.0 available_to_be_picked_up // $3005
                                                                        then                                                                
                                                                        1@ = Marker.CreateIconWithoutSphere(56, 2130.0, 1152.0, 7.0)       
                                                                        else
                                                                            if                                                                  
                                                                            048C: pickup_at 2013.0 1670.0 7.0 available_to_be_picked_up // $3006
                                                                            then                                                                
                                                                            1@ = Marker.CreateIconWithoutSphere(56, 2013.0, 1670.0, 7.0)       
                                                                            else
                                                                                if                                                                  
                                                                                048C: pickup_at 2090.0 1898.0 8.0 available_to_be_picked_up // $3004
                                                                                then                                                                
                                                                                1@ = Marker.CreateIconWithoutSphere(56, 2090.0, 1898.0, 8.0)       
                                                                                else
                                                                                    if                                                                  
                                                                                    048C: pickup_at 2531.0 1569.0 9.0 available_to_be_picked_up // $3007
                                                                                    then                                                                
                                                                                    1@ = Marker.CreateIconWithoutSphere(56, 2531.0, 1569.0, 9.0)       
                                                                                    else
                                                                                        if                                                                   
                                                                                        048C: pickup_at 2578.0 2382.0 16.0 available_to_be_picked_up // $3003
                                                                                        then                                                                 
                                                                                        1@ = Marker.CreateIconWithoutSphere(56, 2578.0, 2382.0, 16.0)       
                                                                                        else
                                                                                            if                                                                    
                                                                                            048C: pickup_at 2998.0 2998.0 -10.0 available_to_be_picked_up // $3008
                                                                                            then                                                                  
                                                                                            1@ = Marker.CreateIconWithoutSphere(56, 2998.0, 2998.0, -10.0)       
                                                                                            end                                                                   
                                                                                        end                                                                  
                                                                                    end                                                                 
                                                                                end                                                                 
                                                                            end                                                                 
                                                                        end                                                                 
                                                                    end                                                                 
                                                                end                                                                  
                                                            end                                                                   
                                                        end                                                                  
                                                    end                                                                  
                                                end                                                                 
                                            end                                                                 
                                        end                                                                    
                                    end                                                                    
                                end                                                                   
                            end                                                                   
                        end                                                                            
                    end                                                                    
                end                                                                   
            end                                                                 
        end                                                                  
    end                                                                                                                                      
jump @OYSTERS_3    
end
    
:OYSTERS_3
wait 10
077E: get_active_interior_to $ACTIVE_INTERIOR
if  
$ACTIVE_INTERIOR == 0
jf @OYSTERS_4
    
if  // условия удаления маркеров, в случае взятия пикапа
pickup.Picked_up($2993)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2984)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2985)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2983)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2988)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2987)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2989)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2982)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2990)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2991)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2992)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($3024)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($3031)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($3023)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($3010)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($3021)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($3011)
then
Marker.Disable(1@)
jump @OYSTERS_1
end 
    
if  
pickup.Picked_up($2986)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3012)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3013)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3016)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3015)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3014)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3017)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($2999)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($2996)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3002)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($2995)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3001)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3022)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3000)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($2997)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($2998)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($2994)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3029)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3027)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3028)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3009)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3018)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3026)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3025)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3020)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3019)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3030)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3005)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3006)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3004)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3007)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3003)
then
Marker.Disable(1@)
jump @OYSTERS_1
end

if
pickup.Picked_up($3008)
then
Marker.Disable(1@)
jump @OYSTERS_1
end
       
if or // условия, при которых будут удалены все маркеры с карты во избежания сохранения их в игре
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)             
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)         
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)                 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)                       
then
jump @OYSTERS_4
else
jump @OYSTERS_3
end

:OYSTERS_4
wait 0
Marker.Disable(1@)
jump @OYSTERS_1

:OYSTERS_5
wait 1000
0A93: end_custom_thread // Удаляем скрипт из памяти     

 

 

[spoiler=2_Версия (Первая часть)]

{$CLEO .cs}

0000: NOP
thread 'PART1'
:PART1_0
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @PART1_0
0A8D: 0@ = read_memory 0xB791EC size 4 virtual_protect 1 // В переменную 0@ будет записано количество найденных ракушек
if
0@ == 50
then
jump @PART1_3
end
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @PART1_0
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)
then
jump @PART1_0
else    
    if  // пошли условия создания маркеров на карте
    048C: pickup_at 1968.0 -1203.0 17.0 available_to_be_picked_up // $2993
    then
    1@ = Marker.CreateIconWithoutSphere(56, 1968.0, -1203.0, 17.0)
    end
    
    if
    048C: pickup_at 1279.0 -806.0 85.0 available_to_be_picked_up // $2984
    then
    2@ = Marker.CreateIconWithoutSphere(56, 1279.0, -806.0, 85.0)
    end
    
    if 
    048C: pickup_at 2945.13 -2051.93 -3.0 available_to_be_picked_up // $2985
    then
    3@ = Marker.CreateIconWithoutSphere(56, 2945.13, -2051.93, -3.0)
    end
    
    if
    048C: pickup_at 2750.0 -2584.0 -5.0 available_to_be_picked_up // $2983
    then
    4@ = Marker.CreateIconWithoutSphere(56, 2750.0, -2584.0, -5.0)
    end 
       
    if 
    048C: pickup_at 2621.0 -2506.0 -5.0 available_to_be_picked_up // $2988
    then
    5@ = Marker.CreateIconWithoutSphere(56, 2621.0, -2506.0, -5.0)
    end
    
    if
    048C: pickup_at 2327.0 -2662.0 -5.0 available_to_be_picked_up // $2987 
    then
    6@ = Marker.CreateIconWithoutSphere(56, 2327.0, -2662.0, -5.0)
    end
       
    if 
    048C: pickup_at 1249.0 -2687.0 -1.0 available_to_be_picked_up // $2989
    then
    7@ = Marker.CreateIconWithoutSphere(56, 1249.0, -2687.0, -1.0)
    end
    
    if
    048C: pickup_at 979.0 -2210.0 -3.0 available_to_be_picked_up // $2982 
    then
    8@ = Marker.CreateIconWithoutSphere(56, 979.0, -2210.0, -3.0)
    end
       
    if 
    048C: pickup_at 725.0 -1849.0 -5.0 available_to_be_picked_up // $2990
    then
    9@ = Marker.CreateIconWithoutSphere(56, 725.0, -1849.0, -5.0)
    end
    
    if
    048C: pickup_at 723.0 -1586.0 -3.0 available_to_be_picked_up // $2991 
    then
    10@ = Marker.CreateIconWithoutSphere(56, 723.0, -1586.0, -3.0)
    end
       
    if 
    048C: pickup_at 155.0 -1975.0 -8.0 available_to_be_picked_up // $2992
    then
    11@ = Marker.CreateIconWithoutSphere(56, 155.0, -1975.0, -8.0)
    end
    
    if
    048C: pickup_at 2767.0 470.0 -8.0 available_to_be_picked_up // $3024 
    then
    12@ = Marker.CreateIconWithoutSphere(56, 2767.0, 470.0, -8.0)
    end
       
    if 
    048C: pickup_at 2179.0 235.0 -5.0 available_to_be_picked_up // $3031
    then
    13@ = Marker.CreateIconWithoutSphere(56, 2179.0, 235.0, -5.0)
    end
    
    if
    048C: pickup_at 2098.0 -108.0 -2.0 available_to_be_picked_up // $3023
    then
    14@ = Marker.CreateIconWithoutSphere(56, 2098.0, -108.0, -2.0)
    end
       
    if 
    048C: pickup_at 486.0 -253.0 -4.0 available_to_be_picked_up // $3010
    then
    15@ = Marker.CreateIconWithoutSphere(56, 486.0, -253.0, -4.0)
    end
    
    if
    048C: pickup_at 40.0 -531.0 -8.0 available_to_be_picked_up // $3021 
    then
    16@ = Marker.CreateIconWithoutSphere(56, 40.0, -531.0, -8.0)
    end
       
    if 
    048C: pickup_at -90.0 -910.0 -5.0 available_to_be_picked_up // $3011
    then
    17@ = Marker.CreateIconWithoutSphere(56, -90.0, -910.0, -5.0)
    end
    
    if
    048C: pickup_at 67.0 -1018.0 -5.0 available_to_be_picked_up // $2986
    then
    18@ = Marker.CreateIconWithoutSphere(56, 67.0, -1018.0, -5.0)
    end
       
    if 
    048C: pickup_at 26.43 -1320.94 -10.04 available_to_be_picked_up // $3012
    then
    19@ = Marker.CreateIconWithoutSphere(56, 26.43, -1320.94, -10.04)
    end
    
    if
    048C: pickup_at -207.0 -1682.0 -8.0 available_to_be_picked_up // $3013
    then
    20@ = Marker.CreateIconWithoutSphere(56, -207.0, -1682.0, -8.0)
    end
       
    if 
    048C: pickup_at -1097.0 -2858.0 -8.0 available_to_be_picked_up // $3016
    then
    21@ = Marker.CreateIconWithoutSphere(56, -1097.0, -2858.0, -8.0)
    end
    
    if
    048C: pickup_at -1175.0 -2639.0 -2.5 available_to_be_picked_up // $3015
    then
    22@ = Marker.CreateIconWithoutSphere(56, -1175.0, -2639.0, -2.5)
    end
       
    if 
    048C: pickup_at -1672.0 -1641.0 -2.0 available_to_be_picked_up // $3014 - Последняя ракушка в округе Лос-Сантоса
    then
    23@ = Marker.CreateIconWithoutSphere(56, -1672.0, -1641.0, -2.0)
    end
     
jump @PART1_1
end

:PART1_1
wait 0
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @PART1_2

if  // условия удаления маркеров, в случае взятия пикапа
pickup.Picked_up($2993)
then
Marker.Disable(1@)
end

if
pickup.Picked_up($2984)
then
Marker.Disable(2@)
end

if
pickup.Picked_up($2985)
then
Marker.Disable(3@)
end

if
pickup.Picked_up($2983)
then
Marker.Disable(4@)
end

if
pickup.Picked_up($2988)
then
Marker.Disable(5@)
end

if
pickup.Picked_up($2987)
then
Marker.Disable(6@)
end

if
pickup.Picked_up($2989)
then
Marker.Disable(7@)
end

if
pickup.Picked_up($2982)
then
Marker.Disable(8@)
end

if
pickup.Picked_up($2990)
then
Marker.Disable(9@)
end

if
pickup.Picked_up($2991)
then
Marker.Disable(10@)
end

if
pickup.Picked_up($2992)
then
Marker.Disable(11@)
end

if
pickup.Picked_up($3024)
then
Marker.Disable(12@)
end

if
pickup.Picked_up($3031)
then
Marker.Disable(13@)
end

if
pickup.Picked_up($3023)
then
Marker.Disable(14@)
end

if
pickup.Picked_up($3010)
then
Marker.Disable(15@)
end

if
pickup.Picked_up($3021)
then
Marker.Disable(16@)
end

if
pickup.Picked_up($3011)
then
Marker.Disable(17@)
end

if
pickup.Picked_up($2986)
then
Marker.Disable(18@)
end

if
pickup.Picked_up($3012)
then
Marker.Disable(19@)
end

if
pickup.Picked_up($3013)
then
Marker.Disable(20@)
end

if
pickup.Picked_up($3016)
then
Marker.Disable(21@)
end

if
pickup.Picked_up($3015)
then
Marker.Disable(22@)
end

if
pickup.Picked_up($3014)
then
Marker.Disable(23@)
end // Последняя ракушка в округе Лос-Сантоса (Last oyster in Los-Santos)


if or // условия, при которых будут удалены все маркеры с карты во избежания сохранения их в игре
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)             
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)         
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)                 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)                       
then
jump @PART1_2
else
jump @PART1_1
end

:PART1_2
wait 0
Marker.Disable(1@)
Marker.Disable(2@)
Marker.Disable(3@)
Marker.Disable(4@)
Marker.Disable(5@)
Marker.Disable(6@)
Marker.Disable(7@)
Marker.Disable(8@)
Marker.Disable(9@)
Marker.Disable(10@)
Marker.Disable(11@)
Marker.Disable(12@)
Marker.Disable(13@)
Marker.Disable(14@)
Marker.Disable(15@)
Marker.Disable(16@)
Marker.Disable(17@)
Marker.Disable(18@)
Marker.Disable(19@)
Marker.Disable(20@)
Marker.Disable(21@)
Marker.Disable(22@)
Marker.Disable(23@)
jump @PART1_0

:PART1_3
wait 0
0A93: end_custom_thread // Удаляем скрипт из памяти 

 

 

[spoiler=2_Версия (Вторая часть)]

{$CLEO .cs}

0000: NOP
thread 'PART2'
:PART2_0
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @PART2_0
0A8D: 0@ = read_memory 0xB791EC size 4 virtual_protect 1 // В переменную 0@ будет записано количество найденных ракушек
if
0@ == 50
then
jump @PART2_3
end
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @PART2_0
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)
then
jump @PART2_0
else    
    if  // пошли условия создания маркеров на карте
    048C: pickup_at -2889.0 -1042.0 -9.0 available_to_be_picked_up // $3017 
    then
    1@ = Marker.CreateIconWithoutSphere(56, -2889.0, -1042.0, -9.0)
    end
       
    if 
    048C: pickup_at -2727.0 -469.0 -5.0 available_to_be_picked_up // $2999
    then
    2@ = Marker.CreateIconWithoutSphere(56, -2727.0, -469.0, -5.0)
    end
    
    if
    048C: pickup_at -1625.0 4.0 -10.0 available_to_be_picked_up // $2996 
    then
    3@ = Marker.CreateIconWithoutSphere(56, -1625.0, 4.0, -10.0)
    end
       
    if 
    048C: pickup_at -1364.0 390.0 -5.0 available_to_be_picked_up // $3002
    then
    4@ = Marker.CreateIconWithoutSphere(56, -1364.0, 390.0, -5.0)
    end
    
    if
    048C: pickup_at -1252.0 501.0 -8.0 available_to_be_picked_up // $2995 
    then
    5@ = Marker.CreateIconWithoutSphere(56, -1252.0, 501.0, -8.0)
    end
       
    if 
    048C: pickup_at -1013.0 478.0 -7.0 available_to_be_picked_up // $3001
    then
    6@ = Marker.CreateIconWithoutSphere(56, -1013.0, 478.0, -7.0)
    end
    
    if
    048C: pickup_at -765.0 247.0 -8.0 available_to_be_picked_up // $3022 
    then
    7@ = Marker.CreateIconWithoutSphere(56, -765.0, 247.0, -8.0)
    end
       
    if 
    048C: pickup_at -1266.0 966.0 -10.0 available_to_be_picked_up // $3000
    then
    8@ = Marker.CreateIconWithoutSphere(56, -1266.0, 966.0, -10.0)
    end
    
    if
    048C: pickup_at -1484.0 1489.0 -10.0 available_to_be_picked_up // $2997 
    then
    9@ = Marker.CreateIconWithoutSphere(56, -1484.0, 1489.0, -10.0)
    end
       
    if 
    048C: pickup_at -2505.406 1543.724 -22.5553 available_to_be_picked_up // $2998
    then
    10@ = Marker.CreateIconWithoutSphere(56, -2505.406, 1543.724, -22.5553)
    end
    
    if
    048C: pickup_at -2657.0 1564.0 -6.0 available_to_be_picked_up // $2994
    then
    11@ = Marker.CreateIconWithoutSphere(56, -2657.0, 1564.0, -6.0)
    end
       
    if 
    048C: pickup_at -2685.0 2153.0 -5.0 available_to_be_picked_up // $3029
    then
    12@ = Marker.CreateIconWithoutSphere(56, -2685.0, 2153.0, -5.0)
    end
    
    if
    048C: pickup_at -2110.5 2329.72 -7.5 available_to_be_picked_up // $3027
    then
    13@ = Marker.CreateIconWithoutSphere(56, -2110.5, 2329.72, -7.5)
    end
       
    if 
    048C: pickup_at -1538.0 1708.0 -3.27 available_to_be_picked_up // $3028
    then
    14@ = Marker.CreateIconWithoutSphere(56, -1538.0, 1708.0, -3.27)
    end
    
    if
    048C: pickup_at -832.0 925.0 -2.0 available_to_be_picked_up // $3009
    then
    15@ = Marker.CreateIconWithoutSphere(56, -832.0, 925.0, -2.0)
    end
       
    if 
    048C: pickup_at -659.0 874.0 -2.0 available_to_be_picked_up // $3018
    then
    16@ = Marker.CreateIconWithoutSphere(56, -659.0, 874.0, -2.0)
    end
    
    if
    048C: pickup_at -821.0 1374.0 -8.0 available_to_be_picked_up // $3026
    then
    17@ = Marker.CreateIconWithoutSphere(56, -821.0, 1374.0, -8.0)
    end
       
    if 
    048C: pickup_at -783.0 2116.0 35.0 available_to_be_picked_up // $3025
    then
    18@ = Marker.CreateIconWithoutSphere(56, -783.0, 2116.0, 35.0)
    end
    
    if
    048C: pickup_at -1066.0 2197.0 32.0 available_to_be_picked_up // $3020 
    then
    19@ = Marker.CreateIconWithoutSphere(56, -1066.0, 2197.0, 32.0)
    end
       
    if 
    048C: pickup_at -955.0 2628.0 35.0 available_to_be_picked_up // $3019
    then
    20@ = Marker.CreateIconWithoutSphere(56, -955.0, 2628.0, 35.0)
    end
    
    if
    048C: pickup_at 796.0 2939.0 -5.0 available_to_be_picked_up // $3030
    then
    21@ = Marker.CreateIconWithoutSphere(56, 796.0, 2939.0, -5.0)
    end
       
    if 
    048C: pickup_at 2130.0 1152.0 7.0 available_to_be_picked_up // $3005
    then
    22@ = Marker.CreateIconWithoutSphere(56, 2130.0, 1152.0, 7.0)
    end
    
    if
    048C: pickup_at 2013.0 1670.0 7.0 available_to_be_picked_up // $3006 
    then
    23@ = Marker.CreateIconWithoutSphere(56, 2013.0, 1670.0, 7.0)
    end
       
    if 
    048C: pickup_at 2090.0 1898.0 8.0 available_to_be_picked_up // $3004
    then
    24@ = Marker.CreateIconWithoutSphere(56, 2090.0, 1898.0, 8.0)
    end
    
    if
    048C: pickup_at 2531.0 1569.0 9.0 available_to_be_picked_up // $3007
    then
    25@ = Marker.CreateIconWithoutSphere(56, 2531.0, 1569.0, 9.0)
    end
       
    if 
    048C: pickup_at 2578.0 2382.0 16.0 available_to_be_picked_up // $3003
    then
    26@ = Marker.CreateIconWithoutSphere(56, 2578.0, 2382.0, 16.0)
    end
    
    if
    048C: pickup_at 2998.0 2998.0 -10.0 available_to_be_picked_up // $3008
    then
    27@ = Marker.CreateIconWithoutSphere(56, 2998.0, 2998.0, -10.0)
    end  
jump @PART2_1
end

:PART2_1
wait 0
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @PART2_2

if  // условия удаления маркеров, в случае взятия пикапа
pickup.Picked_up($3017)
then
Marker.Disable(1@)
end

if
pickup.Picked_up($2999)
then
Marker.Disable(2@)
end

if
pickup.Picked_up($2996)
then
Marker.Disable(3@)
end

if
pickup.Picked_up($3002)
then
Marker.Disable(4@)
end

if
pickup.Picked_up($2995)
then
Marker.Disable(5@)
end

if
pickup.Picked_up($3001)
then
Marker.Disable(6@)
end

if
pickup.Picked_up($3022)
then
Marker.Disable(7@)
end

if
pickup.Picked_up($3000)
then
Marker.Disable(8@)
end

if
pickup.Picked_up($2997)
then
Marker.Disable(9@)
end

if
pickup.Picked_up($2998)
then
Marker.Disable(10@)
end

if
pickup.Picked_up($2994)
then
Marker.Disable(11@)
end

if
pickup.Picked_up($3029)
then
Marker.Disable(12@)
end

if
pickup.Picked_up($3027)
then
Marker.Disable(13@)
end

if
pickup.Picked_up($3028)
then
Marker.Disable(14@)
end

if
pickup.Picked_up($3009)
then
Marker.Disable(15@)
end

if
pickup.Picked_up($3018)
then
Marker.Disable(16@)
end

if
pickup.Picked_up($3026)
then
Marker.Disable(17@)
end

if
pickup.Picked_up($3025)
then
Marker.Disable(18@)
end

if
pickup.Picked_up($3020)
then
Marker.Disable(19@)
end

if
pickup.Picked_up($3019)
then
Marker.Disable(20@)
end

if
pickup.Picked_up($3030)
then
Marker.Disable(21@)
end

if
pickup.Picked_up($3005)
then
Marker.Disable(22@)
end

if
pickup.Picked_up($3006)
then
Marker.Disable(23@)
end

if
pickup.Picked_up($3004)
then
Marker.Disable(24@)
end

if
pickup.Picked_up($3007)
then
Marker.Disable(25@)
end

if
pickup.Picked_up($3003)
then
Marker.Disable(26@)
end

if
pickup.Picked_up($3008)
then
Marker.Disable(27@)
end


if or // условия, при которых будут удалены все маркеры с карты во избежания сохранения их в игре
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)             
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)         
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)                 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)                       
then
jump @PART2_2
else
jump @PART2_1
end

:PART2_2
wait 0
Marker.Disable(1@)
Marker.Disable(2@)
Marker.Disable(3@)
Marker.Disable(4@)
Marker.Disable(5@)
Marker.Disable(6@)
Marker.Disable(7@)
Marker.Disable(8@)
Marker.Disable(9@)
Marker.Disable(10@)
Marker.Disable(11@)
Marker.Disable(12@)
Marker.Disable(13@)
Marker.Disable(14@)
Marker.Disable(15@)
Marker.Disable(16@)
Marker.Disable(17@)
Marker.Disable(18@)
Marker.Disable(19@)
Marker.Disable(20@)
Marker.Disable(21@)
Marker.Disable(22@)
Marker.Disable(23@)
Marker.Disable(24@)
Marker.Disable(25@)
Marker.Disable(26@)
Marker.Disable(27@)
jump @PART2_0

:PART2_3
wait 0
0A93: end_custom_thread // Удаляем скрипт из памяти 

 

 

[spoiler=3_Версия (Основной поток)]

{$CLEO .cs}

0000: NOP
thread 'OYPART1'
:OYPART1_0
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @OYPART1_0
0A8D: 0@ = read_memory 0xB791EC size 4 virtual_protect 1 // В переменную 0@ будет записано количество найденных ракушек
if
0@ == 50
then
jump @OYPART1_3
end
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @OYPART1_0
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)
then
jump @OYPART1_0
else    
    if  // пошли условия создания маркеров на карте
    048C: pickup_at 1968.0 -1203.0 17.0 available_to_be_picked_up // $2993
    then
    1@ = Marker.CreateIconWithoutSphere(56, 1968.0, -1203.0, 17.0)
    else
    1@ = 0
    end
    
    if
    048C: pickup_at 1279.0 -806.0 85.0 available_to_be_picked_up // $2984
    then
    2@ = Marker.CreateIconWithoutSphere(56, 1279.0, -806.0, 85.0)
    else
    2@ = 0    
    end
    
    if 
    048C: pickup_at 2945.13 -2051.93 -3.0 available_to_be_picked_up // $2985
    then
    3@ = Marker.CreateIconWithoutSphere(56, 2945.13, -2051.93, -3.0)
    else
    3@ = 0
    end
    
    if
    048C: pickup_at 2750.0 -2584.0 -5.0 available_to_be_picked_up // $2983
    then
    4@ = Marker.CreateIconWithoutSphere(56, 2750.0, -2584.0, -5.0)
    else
    4@ = 0
    end 
       
    if 
    048C: pickup_at 2621.0 -2506.0 -5.0 available_to_be_picked_up // $2988
    then
    5@ = Marker.CreateIconWithoutSphere(56, 2621.0, -2506.0, -5.0)
    else
    5@ = 0
    end
    
    if
    048C: pickup_at 2327.0 -2662.0 -5.0 available_to_be_picked_up // $2987 
    then
    6@ = Marker.CreateIconWithoutSphere(56, 2327.0, -2662.0, -5.0)
    else
    6@ = 0
    end
       
    if 
    048C: pickup_at 1249.0 -2687.0 -1.0 available_to_be_picked_up // $2989
    then
    7@ = Marker.CreateIconWithoutSphere(56, 1249.0, -2687.0, -1.0)
    else
    7@ = 0
    end
    
    if
    048C: pickup_at 979.0 -2210.0 -3.0 available_to_be_picked_up // $2982 
    then
    8@ = Marker.CreateIconWithoutSphere(56, 979.0, -2210.0, -3.0)
    else
    8@ = 0
    end
       
    if 
    048C: pickup_at 725.0 -1849.0 -5.0 available_to_be_picked_up // $2990
    then
    9@ = Marker.CreateIconWithoutSphere(56, 725.0, -1849.0, -5.0)
    else
    9@ = 0
    end
    
    if
    048C: pickup_at 723.0 -1586.0 -3.0 available_to_be_picked_up // $2991 
    then
    10@ = Marker.CreateIconWithoutSphere(56, 723.0, -1586.0, -3.0)
    else
    10@ = 0
    end
       
    if 
    048C: pickup_at 155.0 -1975.0 -8.0 available_to_be_picked_up // $2992
    then
    11@ = Marker.CreateIconWithoutSphere(56, 155.0, -1975.0, -8.0)
    else
    11@ = 0
    end
    
    if
    048C: pickup_at 2767.0 470.0 -8.0 available_to_be_picked_up // $3024 
    then
    12@ = Marker.CreateIconWithoutSphere(56, 2767.0, 470.0, -8.0)
    else
    12@ = 0
    end
       
    if 
    048C: pickup_at 2179.0 235.0 -5.0 available_to_be_picked_up // $3031
    then
    13@ = Marker.CreateIconWithoutSphere(56, 2179.0, 235.0, -5.0)
    else
    13@ = 0
    end
    
    if
    048C: pickup_at 2098.0 -108.0 -2.0 available_to_be_picked_up // $3023
    then
    14@ = Marker.CreateIconWithoutSphere(56, 2098.0, -108.0, -2.0)
    else
    14@ = 0
    end
       
    if 
    048C: pickup_at 486.0 -253.0 -4.0 available_to_be_picked_up // $3010
    then
    15@ = Marker.CreateIconWithoutSphere(56, 486.0, -253.0, -4.0)
    else
    15@ = 0
    end
    
    if
    048C: pickup_at 40.0 -531.0 -8.0 available_to_be_picked_up // $3021 
    then
    16@ = Marker.CreateIconWithoutSphere(56, 40.0, -531.0, -8.0)
    else
    16@ = 0
    end
       
    if 
    048C: pickup_at -90.0 -910.0 -5.0 available_to_be_picked_up // $3011
    then
    17@ = Marker.CreateIconWithoutSphere(56, -90.0, -910.0, -5.0)
    else
    17@ = 0
    end
    
    if
    048C: pickup_at 67.0 -1018.0 -5.0 available_to_be_picked_up // $2986
    then
    18@ = Marker.CreateIconWithoutSphere(56, 67.0, -1018.0, -5.0)
    else
    18@ = 0
    end
       
    if 
    048C: pickup_at 26.43 -1320.94 -10.04 available_to_be_picked_up // $3012
    then
    19@ = Marker.CreateIconWithoutSphere(56, 26.43, -1320.94, -10.04)
    else
    19@ = 0
    end
    
    if
    048C: pickup_at -207.0 -1682.0 -8.0 available_to_be_picked_up // $3013
    then
    20@ = Marker.CreateIconWithoutSphere(56, -207.0, -1682.0, -8.0)
    else
    20@ = 0
    end
       
    if 
    048C: pickup_at -1097.0 -2858.0 -8.0 available_to_be_picked_up // $3016
    then
    21@ = Marker.CreateIconWithoutSphere(56, -1097.0, -2858.0, -8.0)
    else
    21@ = 0
    end
    
    if
    048C: pickup_at -1175.0 -2639.0 -2.5 available_to_be_picked_up // $3015
    then
    22@ = Marker.CreateIconWithoutSphere(56, -1175.0, -2639.0, -2.5)
    else
    22@ = 0
    end
       
    if 
    048C: pickup_at -1672.0 -1641.0 -2.0 available_to_be_picked_up // $3014 - Последняя ракушка в округе Лос-Сантоса
    then
    23@ = Marker.CreateIconWithoutSphere(56, -1672.0, -1641.0, -2.0)
    else
    23@ = 0
    end
     
jump @OYPART1_1
end

:OYPART1_1
wait 0
gosub @OYPART2_1
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @OYPART1_2

if  // условия удаления маркеров, в случае взятия пикапа
pickup.Picked_up($2993)
then
Marker.Disable(1@)
end

if
pickup.Picked_up($2984)
then
Marker.Disable(2@)
end

if
pickup.Picked_up($2985)
then
Marker.Disable(3@)
end

if
pickup.Picked_up($2983)
then
Marker.Disable(4@)
end

if
pickup.Picked_up($2988)
then
Marker.Disable(5@)
end

if
pickup.Picked_up($2987)
then
Marker.Disable(6@)
end

if
pickup.Picked_up($2989)
then
Marker.Disable(7@)
end

if
pickup.Picked_up($2982)
then
Marker.Disable(8@)
end

if
pickup.Picked_up($2990)
then
Marker.Disable(9@)
end

if
pickup.Picked_up($2991)
then
Marker.Disable(10@)
end

if
pickup.Picked_up($2992)
then
Marker.Disable(11@)
end

if
pickup.Picked_up($3024)
then
Marker.Disable(12@)
end

if
pickup.Picked_up($3031)
then
Marker.Disable(13@)
end

if
pickup.Picked_up($3023)
then
Marker.Disable(14@)
end

if
pickup.Picked_up($3010)
then
Marker.Disable(15@)
end

if
pickup.Picked_up($3021)
then
Marker.Disable(16@)
end

if
pickup.Picked_up($3011)
then
Marker.Disable(17@)
end

if
pickup.Picked_up($2986)
then
Marker.Disable(18@)
end

if
pickup.Picked_up($3012)
then
Marker.Disable(19@)
end

if
pickup.Picked_up($3013)
then
Marker.Disable(20@)
end

if
pickup.Picked_up($3016)
then
Marker.Disable(21@)
end

if
pickup.Picked_up($3015)
then
Marker.Disable(22@)
end

if
pickup.Picked_up($3014)
then
Marker.Disable(23@)
end // Последняя ракушка в округе Лос-Сантоса (Last oyster in Los-Santos)

if or // условия, при которых будут удалены все маркеры с карты во избежания сохранения их в игре
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)             
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)         
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)                 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)                       
then
jump @OYPART1_2
else
jump @OYPART1_1
end

:OYPART1_2
wait 0
Marker.Disable(1@)
Marker.Disable(2@)
Marker.Disable(3@)
Marker.Disable(4@)
Marker.Disable(5@)
Marker.Disable(6@)
Marker.Disable(7@)
Marker.Disable(8@)
Marker.Disable(9@)
Marker.Disable(10@)
Marker.Disable(11@)
Marker.Disable(12@)
Marker.Disable(13@)
Marker.Disable(14@)
Marker.Disable(15@)
Marker.Disable(16@)
Marker.Disable(17@)
Marker.Disable(18@)
Marker.Disable(19@)
Marker.Disable(20@)
Marker.Disable(21@)
Marker.Disable(22@)
Marker.Disable(23@)
jump @OYPART1_0

:OYPART1_3
wait 10
0A93: end_custom_thread // Удаляем скрипт из памяти

:OYPART2_1
wait 10
if and
1@ == 0
2@ == 0
3@ == 0
4@ == 0
5@ == 0
6@ == 0
7@ == 0
8@ == 0
then
    if and
    9@ == 0
    10@ == 0
    11@ == 0
    12@ == 0
    13@ == 0
    14@ == 0
    15@ == 0
    16@ == 0
    then
        if and
        17@ == 0
        18@ == 0
        19@ == 0
        20@ == 0
        21@ == 0
        22@ == 0
        23@ == 0
        then
        0A92: create_custom_thread "OYPART2" // создаем новый поток
        0A93: end_custom_thread
        end
    end
end
return 

 

 

[spoiler=3_Версия (Второй поток)]

{$CLEO .s}

0000: NOP
thread 'OYPART2'
:OYPART2_0
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @OYPART2_0
0A8D: 0@ = read_memory 0xB791EC size 4 virtual_protect 1 // В переменную 0@ будет записано количество найденных ракушек
if
0@ == 50
then
jump @OYPART2_3
end
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @OYPART2_0
if or
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)
then
jump @OYPART2_0
else    
    if  // пошли условия создания маркеров на карте
    048C: pickup_at -2889.0 -1042.0 -9.0 available_to_be_picked_up // $3017 
    then
    1@ = Marker.CreateIconWithoutSphere(56, -2889.0, -1042.0, -9.0)
    end
       
    if 
    048C: pickup_at -2727.0 -469.0 -5.0 available_to_be_picked_up // $2999
    then
    2@ = Marker.CreateIconWithoutSphere(56, -2727.0, -469.0, -5.0)
    end
    
    if
    048C: pickup_at -1625.0 4.0 -10.0 available_to_be_picked_up // $2996 
    then
    3@ = Marker.CreateIconWithoutSphere(56, -1625.0, 4.0, -10.0)
    end
       
    if 
    048C: pickup_at -1364.0 390.0 -5.0 available_to_be_picked_up // $3002
    then
    4@ = Marker.CreateIconWithoutSphere(56, -1364.0, 390.0, -5.0)
    end
    
    if
    048C: pickup_at -1252.0 501.0 -8.0 available_to_be_picked_up // $2995 
    then
    5@ = Marker.CreateIconWithoutSphere(56, -1252.0, 501.0, -8.0)
    end
       
    if 
    048C: pickup_at -1013.0 478.0 -7.0 available_to_be_picked_up // $3001
    then
    6@ = Marker.CreateIconWithoutSphere(56, -1013.0, 478.0, -7.0)
    end
    
    if
    048C: pickup_at -765.0 247.0 -8.0 available_to_be_picked_up // $3022 
    then
    7@ = Marker.CreateIconWithoutSphere(56, -765.0, 247.0, -8.0)
    end
       
    if 
    048C: pickup_at -1266.0 966.0 -10.0 available_to_be_picked_up // $3000
    then
    8@ = Marker.CreateIconWithoutSphere(56, -1266.0, 966.0, -10.0)
    end
    
    if
    048C: pickup_at -1484.0 1489.0 -10.0 available_to_be_picked_up // $2997 
    then
    9@ = Marker.CreateIconWithoutSphere(56, -1484.0, 1489.0, -10.0)
    end
       
    if 
    048C: pickup_at -2505.406 1543.724 -22.5553 available_to_be_picked_up // $2998
    then
    10@ = Marker.CreateIconWithoutSphere(56, -2505.406, 1543.724, -22.5553)
    end
    
    if
    048C: pickup_at -2657.0 1564.0 -6.0 available_to_be_picked_up // $2994
    then
    11@ = Marker.CreateIconWithoutSphere(56, -2657.0, 1564.0, -6.0)
    end
       
    if 
    048C: pickup_at -2685.0 2153.0 -5.0 available_to_be_picked_up // $3029
    then
    12@ = Marker.CreateIconWithoutSphere(56, -2685.0, 2153.0, -5.0)
    end
    
    if
    048C: pickup_at -2110.5 2329.72 -7.5 available_to_be_picked_up // $3027
    then
    13@ = Marker.CreateIconWithoutSphere(56, -2110.5, 2329.72, -7.5)
    end
       
    if 
    048C: pickup_at -1538.0 1708.0 -3.27 available_to_be_picked_up // $3028
    then
    14@ = Marker.CreateIconWithoutSphere(56, -1538.0, 1708.0, -3.27)
    end
    
    if
    048C: pickup_at -832.0 925.0 -2.0 available_to_be_picked_up // $3009
    then
    15@ = Marker.CreateIconWithoutSphere(56, -832.0, 925.0, -2.0)
    end
       
    if 
    048C: pickup_at -659.0 874.0 -2.0 available_to_be_picked_up // $3018
    then
    16@ = Marker.CreateIconWithoutSphere(56, -659.0, 874.0, -2.0)
    end
    
    if
    048C: pickup_at -821.0 1374.0 -8.0 available_to_be_picked_up // $3026
    then
    17@ = Marker.CreateIconWithoutSphere(56, -821.0, 1374.0, -8.0)
    end
       
    if 
    048C: pickup_at -783.0 2116.0 35.0 available_to_be_picked_up // $3025
    then
    18@ = Marker.CreateIconWithoutSphere(56, -783.0, 2116.0, 35.0)
    end
    
    if
    048C: pickup_at -1066.0 2197.0 32.0 available_to_be_picked_up // $3020 
    then
    19@ = Marker.CreateIconWithoutSphere(56, -1066.0, 2197.0, 32.0)
    end
       
    if 
    048C: pickup_at -955.0 2628.0 35.0 available_to_be_picked_up // $3019
    then
    20@ = Marker.CreateIconWithoutSphere(56, -955.0, 2628.0, 35.0)
    end
    
    if
    048C: pickup_at 796.0 2939.0 -5.0 available_to_be_picked_up // $3030
    then
    21@ = Marker.CreateIconWithoutSphere(56, 796.0, 2939.0, -5.0)
    end
       
    if 
    048C: pickup_at 2130.0 1152.0 7.0 available_to_be_picked_up // $3005
    then
    22@ = Marker.CreateIconWithoutSphere(56, 2130.0, 1152.0, 7.0)
    end
    
    if
    048C: pickup_at 2013.0 1670.0 7.0 available_to_be_picked_up // $3006 
    then
    23@ = Marker.CreateIconWithoutSphere(56, 2013.0, 1670.0, 7.0)
    end
       
    if 
    048C: pickup_at 2090.0 1898.0 8.0 available_to_be_picked_up // $3004
    then
    24@ = Marker.CreateIconWithoutSphere(56, 2090.0, 1898.0, 8.0)
    end
    
    if
    048C: pickup_at 2531.0 1569.0 9.0 available_to_be_picked_up // $3007
    then
    25@ = Marker.CreateIconWithoutSphere(56, 2531.0, 1569.0, 9.0)
    end
       
    if 
    048C: pickup_at 2578.0 2382.0 16.0 available_to_be_picked_up // $3003
    then
    26@ = Marker.CreateIconWithoutSphere(56, 2578.0, 2382.0, 16.0)
    end
    
    if
    048C: pickup_at 2998.0 2998.0 -10.0 available_to_be_picked_up // $3008
    then
    27@ = Marker.CreateIconWithoutSphere(56, 2998.0, 2998.0, -10.0)
    end  
jump @OYPART2_1
end

:OYPART2_1
wait 0
077E: get_active_interior_to $ACTIVE_INTERIOR
if
$ACTIVE_INTERIOR == 0
jf @OYPART2_2

if  // условия удаления маркеров, в случае взятия пикапа
pickup.Picked_up($3017)
then
Marker.Disable(1@)
end

if
pickup.Picked_up($2999)
then
Marker.Disable(2@)
end

if
pickup.Picked_up($2996)
then
Marker.Disable(3@)
end

if
pickup.Picked_up($3002)
then
Marker.Disable(4@)
end

if
pickup.Picked_up($2995)
then
Marker.Disable(5@)
end

if
pickup.Picked_up($3001)
then
Marker.Disable(6@)
end

if
pickup.Picked_up($3022)
then
Marker.Disable(7@)
end

if
pickup.Picked_up($3000)
then
Marker.Disable(8@)
end

if
pickup.Picked_up($2997)
then
Marker.Disable(9@)
end

if
pickup.Picked_up($2998)
then
Marker.Disable(10@)
end

if
pickup.Picked_up($2994)
then
Marker.Disable(11@)
end

if
pickup.Picked_up($3029)
then
Marker.Disable(12@)
end

if
pickup.Picked_up($3027)
then
Marker.Disable(13@)
end

if
pickup.Picked_up($3028)
then
Marker.Disable(14@)
end

if
pickup.Picked_up($3009)
then
Marker.Disable(15@)
end

if
pickup.Picked_up($3018)
then
Marker.Disable(16@)
end

if
pickup.Picked_up($3026)
then
Marker.Disable(17@)
end

if
pickup.Picked_up($3025)
then
Marker.Disable(18@)
end

if
pickup.Picked_up($3020)
then
Marker.Disable(19@)
end

if
pickup.Picked_up($3019)
then
Marker.Disable(20@)
end

if
pickup.Picked_up($3030)
then
Marker.Disable(21@)
end

if
pickup.Picked_up($3005)
then
Marker.Disable(22@)
end

if
pickup.Picked_up($3006)
then
Marker.Disable(23@)
end

if
pickup.Picked_up($3004)
then
Marker.Disable(24@)
end

if
pickup.Picked_up($3007)
then
Marker.Disable(25@)
end

if
pickup.Picked_up($3003)
then
Marker.Disable(26@)
end

if
pickup.Picked_up($3008)
then
Marker.Disable(27@)
end


if or // условия, при которых будут удалены все маркеры с карты во избежания сохранения их в игре
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 877.9877 -28.3817 63.1953 radius 60.0 60.0 60.0 // Укрытие Каталины (Catalina's Hideout)             
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 2025.451 997.5287 10.8203 radius 60.0 60.0 60.0 // Отель-Казино "4 Дракона" (The Four Dragons Casino)
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -694.6745 956.7463 12.2547 radius 60.0 60.0 60.0 // Ранчо Майка Торено (Mike Toreno's Ranch)         
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2025.7168 157.9236 29.0391 radius 60.0 60.0 60.0 // Гараж в Доэрти (Doherty Garage)                 
00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere -2037.8574 -2525.165 30.625 radius 60.0 60.0 60.0 // Эйнджел-Пайн (Angel Pine)                       
then
jump @OYPART2_2
else
jump @OYPART2_1
end

:OYPART2_2
wait 0
Marker.Disable(1@)
Marker.Disable(2@)
Marker.Disable(3@)
Marker.Disable(4@)
Marker.Disable(5@)
Marker.Disable(6@)
Marker.Disable(7@)
Marker.Disable(8@)
Marker.Disable(9@)
Marker.Disable(10@)
Marker.Disable(11@)
Marker.Disable(12@)
Marker.Disable(13@)
Marker.Disable(14@)
Marker.Disable(15@)
Marker.Disable(16@)
Marker.Disable(17@)
Marker.Disable(18@)
Marker.Disable(19@)
Marker.Disable(20@)
Marker.Disable(21@)
Marker.Disable(22@)
Marker.Disable(23@)
Marker.Disable(24@)
Marker.Disable(25@)
Marker.Disable(26@)
Marker.Disable(27@)
jump @OYPART2_0

:OYPART2_3
wait 0
0A93: end_custom_thread // Удаляем скрипт из памяти 

 

 

ЗЫ: Сразу после написания поста родилась идея убрать одну метку из первой части 3 версии скрипта вообще. Но пока еще не проверил. Как проверю отпишусь.

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

   И так в соседнем топике был задан вопрос - можно ли как-то увеличить лимит покрасочных работ. В итоге после несколько часовых манипуляций удалось добавить 5ый винил, просто получая максимально возможное количество покрасок из ini-файла. 

   Изначально в игре на большинстве моделей, поддерживающих покрасочные работы, установлено максимум 3 покрасочные работы на номера 0, 1 и 2. Когда мы добавляем 4 покрасочную работу (elegy4.txd к примеру) - она прописывается в игре на номер 3. И большинство знает, что если таким же образом добавить 5 покрасочную работу (elegy5.txd), то ничего не произойдет, т.к. лимит игры максимум в 4 работы.

   Но подняв этот лимит до 5 наша модель засверкала новыми красками, а сам painjob/scin (покрасочная работа или винил) был записан игрой под номером -1. Увеличивая лимит дальше ни к чему хорошему не привело. То максимальное возможное число покрасок сбрасывалось до 4, то вместо 6 и далее покрасок устанавливались какие-то левые текстуры, иногда просто сбрасывая покраску. В общем на этом и все.

   Особого смыла от добавления 5го винила не вижу, т.к. мы не сможем установить его в тюнинг-ателье. Кроме как установкой через клео-скрипты. На данный момент я попросту не нашел строки куда разработчиками были прописаны цены на покраски. 

   [spoiler=Код]

{$CLEO .cs}

thread "CAR1"
:Car
wait 0
if 
00DD: actor $PLAYER_ACTOR driving_car_with_model 562
jf @Car
03C0: 0@ = actor $PLAYER_ACTOR car
if and
    0AB0: key_pressed 9  // Tab+X
    0AB0: key_pressed 88 // 
then
0988: get_car 0@ paintjob 2@
0AF0: write_int 2@ to_ini_file "CLEO\car.ini" section "Car" key "Number" // Текущая покрасочная работа. Не обращайте внимания. Чисто для моих тестов
06EC: get_car 0@ number_of_color_indices_to 3@ // Получим количество возможных покрасочных работ для данного авто
0AF0: 3@ = get_int_from_ini_file "CLEO\car.ini" section "Car" key "Max" // Присвоим максимальное число покрасок из ини фала. Хотя можно просто присвоить 
end																		// значение переменной. Но не пробовал. 

if 
0AB0: key_pressed 48 // Жмем 0
then
06ED: set_car 0@ paintjob 0 // Будет выбрана покрасочная работа elegy1
end

if
0AB0: key_pressed 49 // Жмем 1
then
06ED: set_car 0@ paintjob 1 // Будет выбрана покрасочная работа elegy2
end

if
0AB0: key_pressed 50// Жмем 2
then
06ED: set_car 0@ paintjob 2 // Будет выбрана покрасочная работа elegy3
end

if
0AB0: key_pressed 51 // Жмем 3
then
06ED: set_car 0@ paintjob 3 // В моем случае elegy4
end

if
0AB0: key_pressed 52 // Жмем 4
then
06ED: set_car 0@ paintjob 4 // В моем случае elegy5
end
jump @Car 

 

 

[spoiler=Скрин]http://www.imageup.ru/img218/thumb/53288760.jpg Не обращайте внимания, что 5 скин просто вся тачка голубенькая, так и задумано.

 

car.rar

 

Совсем забыл. На просторах интернета нашел интересный скрипт, который тоже позволяет добавлять новые покрасочные работы, но ,увы и ах, потестить мне его не удалось. Как сажусь в тачку и пишу 'PJ' (условия кода, чтобы встала покраска) получаю вылет. Пробовал изменять код, исход один и тот же - вылет при желании перекрасить авто. Может у кого удастся запустить. 

Easy Paintjobs (Junior_Djjr) для работы нужен newOpcodes.cleo.

Изменено пользователем Constantines
Ссылка на комментарий
Поделиться на другие сайты

 

Но подняв этот лимит до 5 наша модель засверкала новыми красками, а сам painjob/scin (покрасочная работа или винил) был записан игрой под номером -1. Увеличивая лимит дальше ни к чему хорошему не привело. То максимальное возможное число покрасок сбрасывалось до 4, то вместо 6 и далее покрасок устанавливались какие-то левые текстуры, иногда просто сбрасывая покраску. В общем на этом и все.

Это давно известно.

 

В классе CVehicleModelInfo под текстуры для покрасок зарезервировано место для четырёх штук -  short m_anRemapTxds[4]; Дальше в структуре идёт неиспользуемые два байта, туда видимо и записывается пятая покраска.

 

Обойти это ограничение в плагине можно так:

vehicle->m_pRemapTexture = texture;

Пример:

#include "plugin.h"
#include "common.h"
#include "CModelInfo.h"
#include "CTxdStore.h"
#include "CKeyGen.h"
#include "extensions\KeyCheck.h"

using namespace plugin;

class VehicleTexture {
public:
    static int index;

    static void Remap() {
        KeyCheck::Update();
        if (KeyCheck::CheckWithDelay('P', 1000)) {
            CPed *player = FindPlayerPed(-1);
            if (player) {
                if (player->m_pVehicle && player->m_nPedFlags.bInVehicle) {
                    TxdDef *txd = CTxdStore::ms_pTxdPool->GetAt(CModelInfo::ms_modelInfoPtrs[player->m_pVehicle->m_nModelIndex]->m_nTxdIndex);
                    if (txd) {
                        RwTexture *texture = nullptr;

                        switch (index) {
                        case 0:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint1"));     break;
                        case 1:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint2"));     break;
                        case 2:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint3"));     break;
                        case 3:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint4"));     break;
                        case 4:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint5"));     break;
                        case 5:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint6"));     break;
                        case 6:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint7"));     break;
                        case 7:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint8"));     break;
                        case 8:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint9"));     break;
                        case 9:  texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint10"));    break;
                        case 10: texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint11"));    break;
                        case 11: texture = RwTexDictionaryFindHashNamedTexture(txd->m_pRwDictionary, CKeyGen::GetUppercaseKey("paint12"));    break;
                        case 12: player->m_pVehicle->m_pRemapTexture = nullptr; break;
                        }

                        if (texture) {
                            player->m_pVehicle->m_pRemapTexture = texture; 
                            if (index <= 11)
                                ++index;
                            else
                                index = 0;
                        }
                        else {
                            player->m_pVehicle->m_pRemapTexture = nullptr;
                            index = 0;
                        }
                    }
                }
            }
        }
    }

    VehicleTexture() {
        Events::gameProcessEvent += Remap;
    }
} vehTexture;

int VehicleTexture::index = 0;
 

В txd модели добавить покраски с названиями paint1 - paint12 (не обязательно все 12, можно любое количество до 12 включительно).

Плагин поместить в корневой каталог игры.

В архиве с плагином для примера два изменённых txd стандартных моделей.

Покраски ставятся нажатием клавиши P (англ.)

 

P.S. Сегодня юбилей - 10 лет, как я зарегистрировался на GCU   :hi:

 

paint.rar

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...