V
tomto tútoriale sa vám zjednodušene pokúsim ukázať ako
si spraviť staničnú budovu s dvoma nástupišťami podporujúcimi prepravu
pasažierov a s niekoľko koľají naviac Jednoducho celú
kompletnú stanicu.
Stavba väčšieho celku má svôj význam, pretože
obvikle jeden aj keď čo do polygónov rozsiahlý objekt v podstate hru a
počítač zaťaží menej ako tá istá scéna poskladaná z viacej objektov.
Preto je často lepšie postaviť si staničný areál ako jeden objekt. Je
mi jasné, že nie každý má svoje vlastné všetky potrebné objekty a preto
to nieje vždy možné, ale možno vás práve tieto riadky inšpirujú ešte k
rozsiahlejšiemu stavaniu si vlastných objektov čo som si aj dal ako
cieľ tejto stránky.
Nebudem popisovať ako
stavať
budovu, lampu, nakladaciu rampu, trakčné vedenie, či perón
stanice, lebo potrebné informácie
nájdete popísané v iných mojich
tútorialoch o
stavbe objektov. Zameriam sa hlavne na stavbu samotných nástupíšť s
podporou prepravy pasažierov. Náš cieľ
bude
ako celok vyzerať asi nejako nasledovne, pričom všetky objekty budú v
jednej scéne - exportovanom objekte.
Preskočím
teda modelovanie stanice a vôbec objektov a pôjdem rovno na modelovanie
nástupíšť a koľajníc v samostatnom súbore.
Ako prvé si teda
vytvoríme jedno plane o šírke 1.5m (pre úzke nástupište) a dĺžke 100m
(bez aspoň jedného aj inak nefunkčného, alebo neviditeľného polygonu
nieje možné exportovať objekt do TRS). To
umiestnime do pozície X= 2,6, Y=0 a Z=0,1. Pomenujeme ho ako
perón 1 a
bude to naše prvé nástupište.
Všetky
body musia
byť v rovine čo do osy X pretože určujú budúci priebeh kadiaľ povedie
koľaj
pričom krajné zároveň určujú hranice nástupišťa a spolu s ostatnými
trigger. Ak
by neboli v rovine koľaj by nebola rovná. Môže to ale byť aj úmyselné
ak
napríklad chcete postaviť nástupište do oblúka.
Teraz si vytvoríme rovnaké body pre druhý perón. Pre jednoduchosť je
najlepšie
všetky vytvorené označiť, vyklonovať, posunúť a premenovať na
a.track1a,
a.track1b, a.track1c, a.track1d a a.track1e. To samé zopakujeme ešte
raz pre
tretiu koľaj ktorá ale už nebude nástupišťom, ale iba bežnou koľajou.
Tu nám
stačia iba dva krajné body označené ako track2a, a.track2b. Môžeme
samozrejme vytvoriť
i viac nástupíšť či viac samostatných koľajníc.
Keď
máme hotové
samotné koľaje a peróny pristúpime k asi najpracnejšej veci a to
vytvoreniu
pomocných bodov na ktorých sa nám budú zobrazovať nastupujúci a
vystupujúci pasažieri.
Ich počet určuje počet aký chceme mať na stanici a ktorý je zároveň aj
ako
maximálna hodnota v ponuke nastavenia stanice potom v editori.. Čím
väčšia
stanica s čím väčšou prevádzkou požaduje logicky aj viac pasažierova
teda aj
bodov ako malá provinčná stanička. Ich počet obvykle určuje dĺžka
koľaje a
šírka perónu. Predpokladám však ale že aj väčší počet je aj väčší nárok
na
jadro aj keď to nemám overené. Nesmie sa zabudnúť že musia byť dva
druhy -
zjednodušene povedané nastupujúci a vystupujúci pričom obvykle je
vystupujúcich
menej. V našom prípade to bude 80 ku 52 čo bežný štandard na 100 -
metrovú
koľaj stredne veľkej až veľkej stanice. Takže si takto vytvoríme
príslušný
počet pomocných bodov nad perónom vo výške 0.6m čo značí že sa bude
jednať o
perón 0.6m vysoký - pasažieri sa budú zobrazovať 0.6m nad povrchom - a
každého
natočíme tak aby sme nemali všetkých v jednom smere. Ich natáčanie bude
určovať
kam budú zobrazujúci sa pasažieri otočený. Dbajte teda na správne
natočenie a tiež aby ste pasažierov neumiestňovali mimo predpokladaného
budúceho perónu, teda do vzduchu. Výsledkom bude jež z ktorého môžete
spraviť
klon a preniesť na vedľajšie nástupište, alebo rovnako vytvoriť znova
každý
bod.
kuid
<kuid:XXXXXX:XXXXXX> region "NASTUPISTIA" type "Kompletne stanice" kind "industry" light 1 nightmode "lamp" icon-texture "ico_stanica.bmp" script "Station" class "Station" username "Rusovce" |
kuid-table { passenger <kuid:-3:10060> } mesh-table { default { mesh "stanica.im" auto-create 1 } } |
attached-track { track_0 { track <kuid:-1:15> vertices { 0 "a.track0a" 1 "a.track0b" 2 "a.track0c" 3 "a.track0d" 4 "a.track0e" 5 "a.track0f" 6 "a.track0g" } } track_1 { track <kuid:-1:15> vertices { 0 "a.track1a" 1 "a.track1b" 2 "a.track1c" 3 "a.track1d" 4 "a.track1e" 5 "a.track1f" 6 "a.track1g" 7 "a.track1h" 8 "a.track1i" 9 "a.track1j" } } track_2 { track <kuid:-1:15> vertices { 0 "a.track2a" 1 "a.track2b" 2 "a.track2c" 3 "a.track2d" 4 "a.track2e" 5 "a.track2f" 6 "a.track2g" } } track_3 { track <kuid:-1:15> vertices { 0 "a.track3a" 1 "a.track3b" 2 "a.track3c" 3 "a.track3d" 4 "a.track3e" 5 "a.track3f" } } track_4 { track <kuid:-1:15> vertices { 0 "a.track4a" 1 "a.track4b" 2 "a.track4c" 3 "a.track4d" 4 "a.track4e" 5 "a.track4f" } } track_5 { track <kuid:-1:15> vertices { 0 "a.track5a" 1 "a.track5b" 2 "a.track5c" 3 "a.track5d" 4 "a.track5e" 5 "a.track5f" } } track_6 { track <kuid:-1:15> vertices { 0 "a.track6a" 1 "a.track6b" 2 "a.track6c" 3 "a.track6d" 4 "a.track6e" 5 "a.track6f" } } track_7 { track <kuid:-1:15> vertices { 0 "a.track7a" 1 "a.track7b" 2 "a.track7c" 3 "a.track7d" 4 "a.track7e" 5 "a.track7f" } } track_8 { track <kuid:-1:15> vertices { 0 "a.track8a" 1 "a.track8b" 2 "a.track8c" 3 "a.track8d" 4 "a.track8e" 5 "a.track8f" } } track_9 { track <kuid:-1:15> vertices { 0 "a.track9a" 1 "a.track9b" 2 "a.track9c" 3 "a.track9d" 4 "a.track9e" 5 "a.track9f" } } track_10 { track <kuid:-1:15> vertices { 0 "a.track10a" 1 "a.track10b" 2 "a.track10c" 3 "a.track10d" 4 "a.track10e" 5 "a.track10f" } } track_11 { track <kuid:-1:15> vertices { 0 "a.track11a" 1 "a.track11b" 2 "a.track11c" 3 "a.track11d" } } track_12 { track <kuid:-1:15> vertices { 0 "a.track12a" 1 "a.track12b" 2 "a.track12c" 3 "a.track12d" } } } |
Pomenovanie
track_0, track_1, track_2, ... nám určuje o ktorú koľaj ide.
Parameter track nám určuje typ prvotne zobrazenej koľaje (zmení
sa na tú
ktorú k nej potom v editori pripojíte). Verticles potom definuje
postupne body
príslušnej koľaje od prvého po posledný. Pritom začiatok
samotného nástupišťa
nemusí definovať hneď prvý bod ale povedzme až tretí čo popíšem neskôr.
Prvý
bod je absolútne prvý bod koľajnice na ktorú neskôr v editori pripojíme
normálnu koľaj. Ak nechcete abzy sa vami definovaná koľaj menila
po pripojení koľaje v editore pridajte tag useadjoiningtracktype 0.
Ďalšou časťou je definícia trigra ktorý určuje ako sa daná stanica a
vlak bude
chovať. Doporučujem si prečítať CCG pretože toho je viac čo s ním má
spoločné a
čo by ste mali vedieť.
attached-trigger { trigger_track_0_a { att "a.track0a" radius 5 track "track_0" } trigger_track_0_b { att "a.track0b" radius 27 track "track_0" } trigger_track_0_c { att "a.track0c" radius 27 track "track_0" } trigger_track_0_d { att "a.track0d" radius 27 track "track_0" } trigger_track_0_e { att "a.track0e" radius 5 track "track_0" } trigger_track_1_a { att "a.track1c" radius 5 track "track_1" } trigger_track_1_b { att "a.track1d" radius 27 track "track_1" } trigger_track_1_c { att "a.track1e" radius 27 track "track_1" } trigger_track_1_d { att "a.track1f" radius 27 track "track_1" } trigger_track_1_e { att "a.track1g" radius 5 track "track_1" } } |
V
princípe si
treba všimnúť označenie bodov a porovnať ho s umiestnením v gmaxe.
Určuje to
akýsi okruh pôsobenia či ako to zjednodušene nazvať na základe ktorého
sa mení
chovanie a reaguje AI. Preto sme ak si spomeniete ten jeden bod dali do
tej
jednej tretiny v smere kadiaľ pôjde vlak. Parameter att určuje
názov
bodu, radius polomer pôsobenia a track definuje koľaj.
Každý
triger musí mať rôzne pomenovanie a toto musí byť zhodne v označení
scriptu ku
ktorému prídeme neskôr. Tieto definované body však určujú hranice
samotného
nástupišťa. To značí, že koľaj môže začať bodom a.track1a, ďalší môže
byť
a.track1b, ale až bod a.track1c je prvý deklarovaný v tejto časti a
teda určuje
že až od neho začína samotné nástupište. To samé na opačnom konci. Tak
vlastne
môžete postaviť koľaj 300m dlhú, ale iba 50m z nej bude tvoriť samotné
nástupište.
Má to zmysel ak tvoríte kompletnú stanicu a nie iba samotné nástupištia
kedy to
je bezpredmetné.
Ďalšou časťou je definícia samotných bodov pasažierov.
queues { passengers_on_0 { passenger-queue 1 size 80 initial-count 8 product-kuid <kuid:-3:10060> attachment-points { 0 a.passon01 1 a.passon02 2 a.passon03 3 a.passon04 4 a.passon05 5 a.passon06 6 a.passon07 7 a.passon08 8 a.passon09 9 a.passon10 10 a.passon11 11 a.passon12 12 a.passon13 13 a.passon14 14 a.passon15 15 a.passon16 16 a.passon17 17 a.passon18 18 a.passon19 19 a.passon20 20 a.passon21 21 a.passon22 22 a.passon23 23 a.passon24 24 a.passon25 25 a.passon26 26 a.passon27 27 a.passon28 28 a.passon29 29 a.passon30 30 a.passon31 31 a.passon32 32 a.passon33 33 a.passon34 34 a.passon35 35 a.passon36 36 a.passon37 37 a.passon38 38 a.passon39 39 a.passon40 40 a.passon41 41 a.passon42 42 a.passon43 43 a.passon44 44 a.passon45 45 a.passon46 46 a.passon47 47 a.passon48 48 a.passon49 49 a.passon50 50 a.passon51 51 a.passon52 52 a.passon53 53 a.passon54 54 a.passon55 55 a.passon56 56 a.passon57 57 a.passon58 58 a.passon59 59 a.passon60 60 a.passon61 61 a.passon62 62 a.passon63 63 a.passon64 64 a.passon65 65 a.passon66 66 a.passon67 67 a.passon68 68 a.passon69 69 a.passon70 70 a.passon71 71 a.passon72 72 a.passon73 73 a.passon74 74 a.passon75 75 a.passon76 76 a.passon77 77 a.passon78 78 a.passon79 79 a.passon80 } } passengers_off_0 { passenger-queue 1 size 52 initial-count 0 product-kuid <kuid:-3:10060> attachment-points { 0 a.passoff01 1 a.passoff02 2 a.passoff03 3 a.passoff04 4 a.passoff05 5 a.passoff06 6 a.passoff07 7 a.passoff08 8 a.passoff09 9 a.passoff10 10 a.passoff11 11 a.passoff12 12 a.passoff13 13 a.passoff14 14 a.passoff15 15 a.passoff16 16 a.passoff17 17 a.passoff18 18 a.passoff19 19 a.passoff20 20 a.passoff21 21 a.passoff22 22 a.passoff23 23 a.passoff24 24 a.passoff25 25 a.passoff26 26 a.passoff27 27 a.passoff28 28 a.passoff29 29 a.passoff30 30 a.passoff31 31 a.passoff32 32 a.passoff33 33 a.passoff34 34 a.passoff35 35 a.passoff36 36 a.passoff37 37 a.passoff38 38 a.passoff39 39 a.passoff40 40 a.passoff41 41 a.passoff42 42 a.passoff43 43 a.passoff44 44 a.passoff45 45 a.passoff46 46 a.passoff47 47 a.passoff48 48 a.passoff49 49 a.passoff50 50 a.passoff51 51 a.passoff52 } } passengers_on_1 { passenger-queue 1 size 80 initial-count 8 product-kuid <kuid:-3:10060> attachment-points { 0 a.passon101 1 a.passon102 2 a.passon103 3 a.passon104 4 a.passon105 5 a.passon106 6 a.passon107 7 a.passon108 8 a.passon109 9 a.passon110 10 a.passon111 11 a.passon112 12 a.passon113 13 a.passon114 14 a.passon115 15 a.passon116 16 a.passon117 17 a.passon118 18 a.passon119 19 a.passon120 20 a.passon121 21 a.passon122 22 a.passon123 23 a.passon124 24 a.passon125 25 a.passon126 26 a.passon127 27 a.passon128 28 a.passon129 29 a.passon130 30 a.passon131 31 a.passon132 32 a.passon133 33 a.passon134 34 a.passon135 35 a.passon136 36 a.passon137 37 a.passon138 38 a.passon139 39 a.passon140 40 a.passon141 41 a.passon142 42 a.passon143 43 a.passon144 44 a.passon145 45 a.passon146 46 a.passon147 47 a.passon148 48 a.passon149 49 a.passon150 50 a.passon151 51 a.passon152 52 a.passon153 53 a.passon154 54 a.passon155 55 a.passon156 56 a.passon157 57 a.passon158 58 a.passon159 59 a.passon160 60 a.passon161 61 a.passon162 62 a.passon163 63 a.passon164 64 a.passon165 65 a.passon166 66 a.passon167 67 a.passon168 68 a.passon169 69 a.passon170 70 a.passon171 71 a.passon172 72 a.passon173 73 a.passon174 74 a.passon175 75 a.passon176 76 a.passon177 77 a.passon178 78 a.passon179 79 a.passon180 } } passengers_off_1 { passenger-queue 1 size 52 initial-count 0 product-kuid <kuid:-3:10060> attachment-points { 0 a.passoff101 1 a.passoff102 2 a.passoff103 3 a.passoff104 4 a.passoff105 5 a.passoff106 6 a.passoff107 7 a.passoff108 8 a.passoff109 9 a.passoff110 10 a.passoff111 11 a.passoff112 12 a.passoff113 13 a.passoff114 14 a.passoff115 15 a.passoff116 16 a.passoff117 17 a.passoff118 18 a.passoff119 19 a.passoff120 20 a.passoff121 21 a.passoff122 22 a.passoff123 23 a.passoff124 24 a.passoff125 25 a.passoff126 26 a.passoff127 27 a.passoff128 28 a.passoff129 29 a.passoff130 30 a.passoff131 31 a.passof1f32 32 a.passoff133 33 a.passoff134 34 a.passoff135 35 a.passof136 36 a.passoff137 37 a.passoff138 38 a.passoff139 39 a.passoff140 40 a.passoff141 41 a.passoff142 42 a.passoff143 43 a.passoff144 44 a.passoff145 45 a.passoff146 46 a.passoff147 47 a.passoff148 48 a.passoff149 49 a.passoff150 50 a.passoff151 51 a.passoff152 } } } |
Aj tu
si všimnite
zhodu s koľajnicou, resp. perónom a označením bodov ON a OFF a
rozdielom v
počtoch. Parameter passenger-queue
1 je aktivátor, size určuje počet, initial-count určuje
počiatočný
stav (pred definíciou v editore) a product-kuid definuje kuid
tovaru
keďže sa vlastne jedná o priemysel a aj keď to znie komicky teda tovar.
Záver configu tvorí definícia procesov, prípadný pridaný zvuk a
samotných nástupíšť
pre zobrazenie v editori a definície v scripte. Aj tu si prečítajte CCG
pretože
aj tu je toho viac čo by bolo treba spomenúť a tento tútorial by sa
stal už
potom príručkou.
processes { passenger_spawn_0 { start-enabled 1 duration 20 outputs { 0 { amount 1 queue "passengers_on_0" } } } passenger_delete_0 { start-enabled 1 duration 3 inputs { 0 { amount 1 queue "passengers_off_0" } } } passenger_spawn_1 { start-enabled 1 duration 20 outputs { 0 { amount 1 queue "passengers_on_1" } } } passenger_delete_1 { start-enabled 1 duration 3 inputs { 0 { amount 1 queue "passengers_off_1" } } } } soundscript { dayloop { repeat-delay 0 distance 8,130 sound { stanicazvuk01.wav } } } username-sk "Stanica Rusovce" string-table { brickstation_platform1 "Nastupiste 1" brickstation_platform2 "Nastupiste 2" } string-table-sk { brickstation_platform1 "Nastupiste 1" brickstation_platform2 "Nastupiste 2" } |
effects { arow0 { kind attachmend track a.track0a default-mesh <KUID:-3:10092> surveyor-only 1 } arow1 { kind attachmend track a.track0g default-mesh <KUID:-3:10092> surveyor-only 1 } } |
include
"GenericPassengerStation.gs" class Station isclass GenericPassengerStation { bool TriggerSupportsMassStoppedLoad(Vehicle vehicle, string triggerName) { bool vehicleToTrain = vehicle.GetFacingRelativeToTrain(); if (triggerName == "trigger_track_0_a" or triggerName == "trigger_track_0_e") { int direction = vehicle.GetRelationToTrack(me, "track_0"); if (!vehicleToTrain) direction = -direction; if (direction == Vehicle.DIRECTION_BACKWARD and triggerName == "trigger_track_0_e") return true; if (direction == Vehicle.DIRECTION_FORWARD and triggerName == "trigger_track_0_a") return true; } if (triggerName == "trigger_track_0_a" or triggerName == "trigger_track_0_b" or triggerName == "trigger_track_0_c" or triggerName == "trigger_track_0_d" or triggerName == "trigger_track_0_e") { if (vehicle.GetMyTrain().IsStopped()) return true; } if (triggerName == "trigger_track_1_a" or triggerName == "trigger_track_1_e") { int direction = vehicle.GetRelationToTrack(me, "track_1"); if (!vehicleToTrain) direction = -direction; if (direction == Vehicle.DIRECTION_BACKWARD and triggerName == "trigger_track_1_e") return true; if (direction == Vehicle.DIRECTION_FORWARD and triggerName == "trigger_track_1_a") return true; } if (triggerName == "trigger_track_1_a" or triggerName == "trigger_track_1_b" or triggerName == "trigger_track_1_c" or triggerName == "trigger_track_1_d" or triggerName == "trigger_track_1_e") { if (vehicle.GetMyTrain().IsStopped()) return true; } return false; } void GetTrackAndSide(Vehicle vehicle, string triggerName, TrackLoadInfo retInfo) { if (triggerName == "trigger_track_0_a" or triggerName == "trigger_track_0_b" or triggerName == "trigger_track_0_c" or triggerName == "trigger_track_0_d" or triggerName == "trigger_track_0_e") { retInfo.trackName = "track_0"; retInfo.trainLeftSide = ((vehicle.GetRelationToTrack(me, retInfo.trackName) != Vehicle.DIRECTION_FORWARD) == vehicle.GetDirectionRelativeToTrain()); retInfo.platformIndex = 0; } if (triggerName == "trigger_track_1_a" or triggerName == "trigger_track_1_b" or triggerName == "trigger_track_1_c" or triggerName == "trigger_track_1_d" or triggerName == "trigger_track_1_e") { retInfo.trackName = "track_1"; retInfo.trainLeftSide = ((vehicle.GetRelationToTrack(me, retInfo.trackName) != Vehicle.DIRECTION_FORWARD) == vehicle.GetDirectionRelativeToTrain()); retInfo.platformIndex = 1; } } public void Init(void) { inherited(); InitPassengerStation(2); StationMain(); } public void AppendDriverDestinations(string[] destNames, string[] destTracks) { StringTable stringTable = GetAsset().GetStringTable(); destNames[destNames.size()] = stringTable.GetString("rusovce_platform1"); destTracks[destTracks.size()] = "track_0"; destNames[destNames.size()] = stringTable.GetString("rusovce_platform2"); destTracks[destTracks.size()] = "track_1"; } }; |