#1 09-06-2008 15:33

AlphaOmega
Registered: 02-06-2008
Posts: 98

Собираем поезд и отправляемся в путь!

ВНИМАНИЕ!!! новая версия...

МАШИНИСТ.

характеристики:
* выбор станции (6 штук, в т.ч. трамвайное депо)
* выбор направления (по часовой стрелке или против)
* конструктор состава (выбор любой комбинации вагонов)
* поддержка gtt*** моделей
* поддержка выполнения миссий
* активация по CTRL+T (как на улице, так и в помещении)

нововведения:
* устранена ошибка размещения на запасных путях
* возможность выбрать начальную станцию
* улучшен интерфейс выбора
* можно переключатся (компилятором) между обычной и gtt версией
* машинист более не выкидывает игрока из кабины
* глобальные переменные заменены на локальные
* др. мелкие. корректировки

плюсы над оригинальной игрой:
* не надо ждать пока приедет поезд
* можно собрать состав из любых вагонов
* можно покататься на трамвае (в качестве машиниста)

плюсы над исходным скриптом
* отсутствие глюка повторного нажатия
* а так же всё, что указано выше в нововведениях

файл MACHINIST.CS

// advanced train operator script
// by AlphaOmega
// v2.0

{$CLEO .cs}

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

:start

thread 'MACHINIST'

0000: NOP

:check
wait 0
if and
0AB0: key_pressed 0x11 // ctrl
0AB0: key_pressed 0x54 // t 
jf @check

02A3: toggle_widescreen 1

Player.CanMove($PLAYER_CHAR) = False

0340: set_text_draw_RGBA 180 180 180 255 
033F: set_text_draw_letter_size 0.5 2.5 
03E4: enable_text_draw_align_right 0 
0341: unknown_text_draw_flag 0 
0342: enable_text_draw_centered 0 
0343: set_text_draw_linewidth 200.0 
0348: enable_text_draw_proportional 1 
0345: enable_text_draw_background 0 
0343: set_text_draw_linewidth 680.0 

08D4: 10@ = create_panel_with_title 'TRAINS' position 50.0 110.0 width 277.0 columns 1 interactive 1 background 1 alignment 1
08DB: set_panel 10@ column 0 header 'DUMMY' data 'TRAINA' 'TRAINB' 'TRAINC' 'TRAIND' 'TRAINE' 'TRAINF' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 
090E: set_panel 10@ active_row 0

:routeA
wait 0 
if 
00E1: player 0 pressed_key 15 // return 
jf @routeZ

jump @menuEND

:routeZ
if 
00E1: player 0 pressed_key 16 // select
jf @routeA

03E6: remove_text_box 
08D7: 11@ = panel 10@ active_row
08DA: remove_panel 10@
03E6: remove_text_box 
00BE: text_clear_all

:pathA
if
0039: 11@ == 0
jf @pathB
0007: 1@ = -1943.678 
0007: 2@ = 137.810 
0007: 3@ = 26.0
jump @pathOK

:pathB
if
0039: 11@ == 1
jf @pathC
0007: 1@ = 1433.51 
0007: 2@ = 2632.61 
0007: 3@ = 11.0
jump @pathOK

:pathC
if
0039: 11@ == 2
jf @pathD
0007: 1@ = 2865.93
0007: 2@ = 1290.672 
0007: 3@ = 11.0
jump @pathOK

:pathD
if
0039: 11@ == 3
jf @pathE
0007: 1@ = 1719.752 
0007: 2@ = -1954.3 
0007: 3@ = 14.0
jump @pathOK

:pathE
if
0039: 11@ == 4
jf @pathF
0007: 1@ = 817.583 
0007: 2@ = -1368.526 
0007: 3@ = -2.0
jump @pathOK

:pathF
0007: 1@ = -2264.773 
0007: 2@ = 527.44 
0007: 3@ = 35.280
jump @pathOK

:pathOK
06D7: enable_train_traffic 0 
select_interior 0 
0860: link_actor $PLAYER_ACTOR to_interior 0 
04E4: unknown_refresh_game_renderer_at 1@ 2@
Actor.PutAt($PLAYER_ACTOR, 1@, 2@, 3@)

29@ = -381995 
&0(29@,1i) = 538 
29@ = -381994 

:clear0
&0(29@,1i) = 0 
29@ += 1 
29@ > -381980 
jf @clear0 

Model.Load(449) // tram
Model.Load(537) // freighter
Model.Load(536) // freight reverse
Model.Load(590) // freight box
Model.Load(569) // freight flat
Model.Load(538) // streak
Model.Load(607) // streak tail
Model.Load(606) // streak c alternative
Model.Load(570) // streak c 

038B: load_requested_models

:preLOAD
wait 0 
if and
Model.Available(449)
Model.Available(537)
Model.Available(536)
Model.Available(590)
Model.Available(569)
Model.Available(538)
Model.Available(607)
Model.Available(606)
Model.Available(570) 
jf @preLOAD 

08D4: 10@ = create_panel_with_title 'TRAINX' position 50.0 110.0 width 210.0 columns 1 interactive 1 background 1 alignment 1
08DB: set_panel 10@ column 0 header 'DUMMY' data 'TRAINY' 'TRAINZ' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 'DUMMY' 
090E: set_panel 10@ active_row 0
wait 500

:directionA
wait 0 
if 
00E1: player 0 pressed_key 15 // return 
jf @directionZ

jump @menuEND

:directionZ
if 
00E1: player 0 pressed_key 16 // select
jf @directionA

03E6: remove_text_box 
08D7: 11@ = panel 10@ active_row
08DA: remove_panel 10@
03E6: remove_text_box 
00BE: text_clear_all
4@ = 0 // direction

if
 11@ == 0
jf @ready
4@ = 1
 
:ready
0006: 9@ = 15 // max carriages count
0006: 6@ = 0 // current carriages count

08D4: 10@ = create_panel_with_title 'TRAINV' position 50.0 110.0 width 155.0 columns 1 interactive 1 background 1 alignment 1

/////////////////////////////////////////////////////
08DB: set_panel 10@ column 0 header 'DUMMY' data 'TRAIN1' 'DUMMY' 'TRAIN3' 'DUMMY' 'TRAIN5' 'DUMMY' 'TRAIN7' 'TRAIN8' 'TRAIN9' 'DUMMY' 'DUMMY' 'DUMMY'
/////////////////////////////////////////////////////
 
090E: set_panel 10@ active_row 0
wait 500

:carsA
wait 0

if 
001D: 9@ > 6@
jf @carsOK

01E3: show_text_1number_styled GXT 'TRAINN' number 6@ time 200 style 5
if 
00E1: player 0 pressed_key 15 // cancel (enter) 
004D: jump_if_false @carsB
jump @carsX

:carsB
if 
00E1: player 0 pressed_key 16 // select (shift)
004D: jump_if_false @carsA
6@ += 1
0089: 30@ = 6@

wait 250
08D7: 11@ = panel 10@ active_row

0085: 29@ = 30@
29@ -= 381995

if 
11@ == 0 
jf @carsC 
&0(29@,1i) = 538 

:carsC
if 
11@ == 1 
jf @carsD 
&0(29@,1i) = 607 

:carsD
if 
11@ == 2 
jf @carsE 
&0(29@,1i) = 570

:carsE
if 
11@ == 3 
jf @carsF 
&0(29@,1i) = 606

:carsF
if 
11@ == 4 
jf @carsG 
&0(29@,1i) = 537

:carsG
if 
11@ == 5 
jf @carsH 
&0(29@,1i) = 536

:carsH
if 
11@ == 6 
jf @carsI 
&0(29@,1i) = 590

:carsI
if 
11@ == 7 
jf @carsJ 
&0(29@,1i) = 569

:carsJ
if 
11@ == 8 
jf @carsK 
&0(29@,1i) = 449

:carsK
jump @carsA

:carsX
if 
6@ == 0
jf @carsOK 
jump @menuEND

:carsOK
wait 250
0012: 4@ *= -1 
06D8: 0@ = create_train_at 1@ 2@ 3@ type 15 direction 4@
07C7: put_train 0@ at 1@ 2@ 3@
046C: 5@ = car 0@ driver
009B: destroy_actor 5@ 
Player.CanMove($PLAYER_CHAR) = True
036A: put_actor $PLAYER_ACTOR in_car 0@

wait 10
06DD: set_train 0@ speed 0.0
06DC: set_train 0@ acc 0.0
015A: restore_camera
09AD: vehicle_camera_mode 1
0373: set_camera_directly_behind_player
08DA: remove_panel 10@
02A3: toggle_widescreen 0
03E6: remove_text_box 
00BE: text_clear_all

:clear1
wait 1000
if 
8449: not actor $PLAYER_ACTOR in_a_car 
jf @clear1

29@ = -381995 
&0(29@,1i) = 538 
29@ = -381994 

:clear2
&0(29@,1i) = 0 
29@ += 1 
29@ > -381980 
jf @clear2
 
Model.Destroy(449) // tram
Model.Destroy(537) // freighter
Model.Destroy(536) // freight reverse
Model.Destroy(590) // freight box
Model.Destroy(569) // freight flat
Model.Destroy(538) // streak
Model.Destroy(607) // streak tail
Model.Destroy(606) // streak c alternative
Model.Destroy(570) // streak c 
07BE: remove_references_to_train 0@
Camera.Restore

:menuEND
wait 500
Player.CanMove($PLAYER_CHAR) = True
015A: restore_camera
08DA: remove_panel 10@
06D7: enable_train_traffic 1 
02A3: toggle_widescreen 0
03E6: remove_text_box 
00BE: text_clear_all
wait 2500;
jump @check

файл MACHINIST.FXT

TRAINS Train Station
TRAINA Cranberry (San Fierro East)
TRAINB Yellow Bell (Las Venturas North)
TRAINC Linden (Las Venturas East)
TRAIND Unity (Los Santos South)
TRAINE Market (Los Santos West)
TRAINF Tram (San Fierro Central)
TRAINX Train Direction
TRAINY ~>~ ClockWise
TRAINZ ~<~ CouterClockWise
TRAINV Train Cars
TRAIN1 Electric
TRAIN2 Electric tail
TRAIN3 Passanger odd
TRAIN4 Passanger even
TRAIN5 Freighter
TRAIN6 Freighter reverse
TRAIN7 Passenger car
TRAIN8 Goods car
TRAIN9 Tram
TRAINN ~y~~1~

[small]ещё раз напоминаю, что это НЕ МОДИФИКАЦИЯ старого скрипта, а ПОЛНОСТЬЮ ПЕРЕПИСАННЫЙ скрипт![/small]

Для переключения между обычной и gtt* версиями достаточно заменить одну строку:

для GTT версии (приатаченный cs файл):

/////////////////////////////////////////////////////
08DB: set_panel 10@ column 0 header 'DUMMY' data 'TRAIN1' 'TRAIN2' 'TRAIN3' 'TRAIN4' 'TRAIN5' 'TRAIN6' 'TRAIN7' 'TRAIN8' 'TRAIN9' 'DUMMY' 'DUMMY' 'DUMMY'
/////////////////////////////////////////////////////

для обычной версии (приведённый cs скрипт):

/////////////////////////////////////////////////////
08DB: set_panel 10@ column 0 header 'DUMMY' data 'TRAIN1' 'DUMMY' 'TRAIN3' 'DUMMY' 'TRAIN5' 'DUMMY' 'TRAIN7' 'TRAIN8' 'TRAIN9' 'DUMMY' 'DUMMY' 'DUMMY'
/////////////////////////////////////////////////////

________________________________
* gtt поезда - это поезда, распространяемый на сайте Grand Theft Trains Club`а - особенность заключается в том, что помимо стандартных моделей поездов, добавляются ещё и особые вариации, например: головной и хвостовой вагон (развёрнутые в разные стороны), чётные и нечётные вагоны (например с пантографом и без), главный и дополнительный тепловоз и т.д...

Last edited by AlphaOmega (15-06-2008 15:04)

Offline

#2 09-06-2008 15:38

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

На всякий случай укажу, какие модели используются в GTT.

Красный цвет - Стандартные поезда
Синий цвет - Специальный поезда

Model.Destroy(449) // tram
Model.Destroy(537) // freighter
Model.Destroy(536) // freight reverse
Model.Destroy(590) // freight box
Model.Destroy(569) // freight flat
Model.Destroy(538) // streak
Model.Destroy(607) // streak tail
Model.Destroy(606) // streak c alternative
Model.Destroy(570) // streak c

Ссылок на GTT давать не буду ибо будет рекламой (ищите сами)

Offline

#3 09-06-2008 15:48

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Собираем поезд и отправляемся в путь!

Я уже вижу как минимум один существенный недостаток - глобальные переменные. Все переменные, кроме $PLAYER_CHAR, $PLAYER_ACTOR нужно срочно заменить на локальные.

Ей-богу, я добавлю в санник специальную проверку на глобальные переменные, так что он вообще такие скрипты не будет компилировать.

Offline

#4 09-06-2008 15:59

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

Seemann wrote:

Я уже вижу как минимум один существенный недостаток - глобальные переменные.

ААааааааа..... семён, семёныч! ТАК вот почему у меня два скрипта смены камеры друг друга гасят! У обоих используется глобальная переменная $CAM которую я задавал....
Так отсда вопрос: а как задать глобальную переменную ТАК, чтобы она была не из цифр, а из букв? не всмысле string, а всмысле name..  типа $cam и cam@ вместо 123456789@

Offline

#5 09-06-2008 16:09

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Собираем поезд и отправляемся в путь!

Глобальные переменные ($) вообще не рекомендуется использовать в CLEO-скриптах, не важно каким способом их называть. Есть только 2 исключения: 1) это общераспространенные переменные типа $PLAYER_CHAR, $PLAYER_GROUP, $ONMISSION и 2) неиспользуемые переменные типа $30, $56. В любом случае к использованию глобальных переменных нужно подходить очень осторожно, иначе не минуемы различные глюки в игре.

Зато СВОБОДНО, БЕЗ ОГРАНИЧЕНИЙ можно пользоваться локальными переменными. Мало 32-х переменных? Есть масса способов как обойти ограничение (начиная от простой оптимизации, заканчивая использованием scm-функций - 0AB1, 0AB2). 

Если неудобно пользоваться локальными переменными из-за их имени (согласен, 1@ не всегда явно выражает смысл переменной), пользуйтесь конструкцией CONST..END Пара строк

const
TRAIN_MODEL = 1@
end

позволяет использовать в скрипте слово TRAIN_MODEL, которое на самом деле будет обозначать локальную переменную и компилироваться соответственно. Например,

TRAIN_MODEL = 400  - это в переменную 1@ записали число 400.

И все, больше никаких проблем из-за глобальных переменных.


ЗЫ. Если очень нужно, могу показать пример, как из одного CLEO-скрипта изменить локальную переменную другого.


ЗЫ2 Добавил это сообщение в FAQ

Offline

#6 09-06-2008 17:31

Yarik
Registered: 22-02-2008
Posts: 173
Website

Re: Собираем поезд и отправляемся в путь!

исключен «кривой» маршрут harm/docks, летающий в воздухе

так его вообще подключить?

Offline

#7 09-06-2008 18:05

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

Yarik wrote:

исключен «кривой» маршрут harm/docks, летающий в воздухе

так его вообще подключить?

Кого подключить? маршрут или мой скрипт?

Offline

#8 10-06-2008 08:00

Yarik
Registered: 22-02-2008
Posts: 173
Website

Re: Собираем поезд и отправляемся в путь!

Маршрут

Offline

#9 10-06-2008 13:54

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

Yarik wrote:

Маршрут

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

Offline

#10 10-06-2008 17:33

Yarik
Registered: 22-02-2008
Posts: 173
Website

Re: Собираем поезд и отправляемся в путь!

Тоесть просто поставить на одну из координат того пути и он сам поедет по тому же пути?

Offline

#11 10-06-2008 18:09

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

Yarik wrote:

Тоесть просто поставить на одну из координат того пути и он сам поедет по тому же пути?

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

Offline

#12 10-06-2008 19:05

flashTrash
From: Н.Новгород
Registered: 21-02-2007
Posts: 260
Website

Re: Собираем поезд и отправляемся в путь!

Хороший скрипт! Мну нравится!:^
Ну и несколько замечаний.:D
Может сделать вариант скрипта со стандартными поездами(и именами в fxt файле. просто не у всех стоят поезда, да и blade на поезд не очень тянет)?
Перед созданием поезда надо очищать зону от других поездов. А то я пришел на вокзал, приехал поезд, я нажал ctrl+t, собрал поезд и.. так пять раз пока не понял, что приехавший стандартный поезд закрывает собой тот, что я собрал. Надеюсь понятно объяснил.=)

Продолжай совершенствовать мод, и удачи!

Offline

#13 10-06-2008 23:59

Yarik
Registered: 22-02-2008
Posts: 173
Website

Re: Собираем поезд и отправляемся в путь!

правдо в конце пути может вести себя криво... например, проехать сквозь себя

Ну эт я знаю, эт не проблема. Хотелось бы чтобы там было движение постоянное а не самому ставить поезда...как бы тот путь подключить...?
Сорри за офф, эт уже мысли вслух smile

Offline

#14 11-06-2008 15:57

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

flashTrash wrote:

Хороший скрипт! Мну нравится!

Это хорошо! хоть кому-то мой труд оказался полезным :-)

flashTrash wrote:

Может сделать вариант скрипта со стандартными поездами(и именами в fxt файле. просто не у всех стоят поезда, да и blade на поезд не очень тянет)?

А ты просто вместо тех поездов (у меня они там ниже подписаны) при создании меню поставь 'DUMMY' - пункты будут пустыми и курсор будет проскакивать сквозь них. Ну а в fxt сам пропиши названия как угодно тебе.

flashTrash wrote:

Перед созданием поезда надо очищать зону от других поездов. А то я пришел на вокзал, приехал поезд, я нажал ctrl+t, собрал поезд и.. так пять раз пока не понял, что приехавший стандартный поезд закрывает собой тот, что я собрал. Надеюсь понятно объяснил.=)

Да, к сожалению поезд так уничтожить нельзя. Во всяком случае соответствующего опкода не нашёл. А релиз трейн это только чтобы не запоминался твой "набор" вагонов..

Last edited by AlphaOmega (11-06-2008 15:57)

Offline

#15 11-06-2008 17:52

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

мдя....
странно всё это - на работе тестировал - поезд создавался именно на том, пути, на котором стоял игрок, а сегодня он как-то не так работает. Решил даже скрипт создать по появлению поезда по ALT+T там, где стоит игрок, но, оказалось, он не создаётся там, а только на одном из заранее "известных" путей... вообщем даже и не знаю как же всё-таки заставить поезд появиться ТОЧНО на том, пути, где ему указано......

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

Last edited by AlphaOmega (11-06-2008 17:54)

Offline

#16 11-06-2008 17:54

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Собираем поезд и отправляемся в путь!

Попробуй 07С7 в 1@ 2@ 3@. И ради бога убери глобальные переменные

Offline

#17 15-06-2008 15:03

AlphaOmega
Registered: 02-06-2008
Posts: 98

Re: Собираем поезд и отправляемся в путь!

ВЫШЛА НОВАЯ ВЕРСИЯ!
Скрипт обновил (см. 1 пост)
К нему же приаттачил скомпилированный скрипт (gtt версию) в паре со скриптом «от первого лица»)

нововведения:
* устранена ошибка размещения на запасных путях
* возможность выбрать начальную станцию
* улучшен интерфейс выбора
* можно переключатся (компилятором) между обычной и gtt версией
* машинист более не выкидывает игрока из кабины
* глобальные переменные заменены на локальные
* др. мелкие. корректировки

Last edited by AlphaOmega (15-06-2008 15:05)

Offline

Board footer

Powered by FluxBB