====== Fahrstühle ======
Es gibt mehrere Arten Fahrstühle. Der einfachste ist eine Tür, die statt der normalen Türbewegung (seitwärts aufschieben) nach oben und unten fährt. Allerdings kann man mit diesem Türen-Aufzug nur zwei Stockwerke miteinander verbinden.

Um einen "echten" Aufzug zu erstellen benötigt man einiges mehr an Entities: Einen [[source:entities:func_tracktrain]], mehrere [[half-life_2:entities:path_track]]'s, die entsprechenden [[source:entities:func_button]]'s (um den Aufzug zu rufen und in ein Stockwerk zu schicken) und einen [[source:entities:logic_compare]], der entscheidet, wo der Aufzug stehen bleiben soll.

===== Methode 1: Aufwändiger Fahrstuhl =====

==== Grundidee ====
Wir wollen wie folgt vorgehen:
Der Aufzug soll als [[source:entities:func_tracktrain]] an mehreren [[half-life_2:entities:path_track]] entlangfahren. Gesteuert wird der Aufzug über Buttons im Aufzug und in den jeweiligen Stockwerken und über einen [[source:entities:logic_compare]]. Die Buttons sagen dem [[source:entities:logic_compare]] dabei immer wohin der Aufzug fahren soll (Compare value), die [[half-life_2:entities:path_track]]'s sagen dem [[source:entities:logic_compare]], wo der Aufzug sich gerade befindet (Initial value). Durch den compare der values kann der [[source:entities:logic_compare]] entscheiden, ob der Aufzug hoch (StartForward des [[source:entities:func_tracktrain]]) oder runter (StartBackward) fahren bzw. stehen bleiben (Stop) soll.

==== Der Aufzug ====

Als erstes benötigen wir ein Gebäude mit mehreren Ebenen und eine Aufzugskabine. Die Kabine wird dann zu einem [[source:entities:func_tracktrain]]. Folgende Einstellungen sind nötig:
  * **Name**: Lift (Der Name, mit dem ihr den Lift später ansprecht)
  * **First stop target**: Stock2 (Der [[half-life_2:entities:path_track]], an dem der Lift starten soll)
  * **Height above track**: 0 (Wie hoch soll der Aufzug über einem [[half-life_2:entities:path_track]] schweben. Mein Aufzug ist exakt ausgerichtet, also 0 units über dem [[half-life_2:entities:path_track]])

Flags:
  * **No Pitch** (Der Aufzug soll sich nicht drehen)
  * **No User Control** (Der Aufzug soll nicht wie z.B. ein Zug aus HalfLife 1 steuerbar sein)

Folgendes solltet Ihr setzen, müsst aber nicht:
  * **Damage on crush**: 50 (Wenn ein Spieler den Lift blockiert, kriegt er diesen Schaden)
  * **Move Sound**: doors/garage_move1.wav (Mir hat dieser Sound am besten gefallen)

Als nächstes erstellen wir (in meinem Fall sind es 4 Stockwerke) 4 [[half-life_2:entities:path_track]]'s. Diese müssen die folgenden Einstellugen haben:
  * **Name**: Stock1 (Die einzelnen [[half-life_2:entities:path_track]]'s werden durchnumeriert wie die Stockwerke)
  * **Next stop traget**: Stock2 (Gebt jeweils den nächsten [[half-life_2:entities:path_track]] an. Der letzte hat keinen weiteren Stop.)

Wenn Ihr fertig seid, sollte es ungefähr so aussehen:

{{half-life_2:tutorials:fahrstuehle:1.jpg}}

==== Wo ist der Aufzug? ====
Sobald die [[half-life_2:entities:path_track]]'s erstellt sind, benötigen wir den [[source:entities:logic_compare]]. Dieser wird dafür zuständig sein, dem Aufzug zu sagen, ob er noch weiterfahren soll oder ob er in einem bestimmten Stockwerk stehenbleiben soll.
Einstellungen:
  * **Name**: LogicCompare (Der Name, mit dem der [[source:entities:logic_compare]] referenziert wird)
  * **Initial value**: 2 (Das Initial value verwenden wir immer, um festzustellen, wo der Aufzug sich gerade befindet. Am Anfang soll dieser im zweiten Stock starten.)
  * **Compare value**: 2 (Das Compare value wird immer verwendet, um festzustellen, wo der Aufzug hin soll. Am Anfang soll dieser im zweiten Stock starten und bleiben.)

Das [[source:entities:logic_compare]] wird jetzt immer getriggert (bzw. eigentlich "compared"), um den Aufzug nach oben oder unten fahren zu lassen oder um stehen zu bleiben. Das heisst, wir tragen unter Outputs folgendes ein:
  * **OnEqualTo** - Lift - Stop - 0.00 (Wenn die Werte "Wo bin ich" und "Wo soll ich hin" also gleich sind, bleibt der Aufzug namens "Lift" stehen, und zwar sofort)
  * **OnGreaterThan** - Lift - StartBackward - 0.00 (Wenn der Wert "Wo bin ich" grösser ist als der Wert "Wo soll ich hin", dann muss der Aufzug namens "Lift" nach unten fahren, und zwar sofort)
  * **OnLessThan** - Lift - StartForward - 0.00 (Wenn der Wert "Wo bin ich" kleiner ist als der Wert "Wo soll ich hin", dann muss der Aufzug namens "Lift" nach oben fahren, und zwar sofort)

{{half-life_2:tutorials:fahrstuehle:2.jpg}}

Der [[source:entities:logic_compare]] muss nun getriggert werden. Dies muss auf zwei Arten passieren:
  - Der Aufzug fährt bereits und wird von jedem [[half-life_2:entities:path_track]] an dem er vorbeifährt getriggert
  - Der Aufzug steht momentan und wird durch einen Spieler anhand eines Buttons getriggert

==== Vorbeifahrender Aufzug ====
Also wieder zu den [[half-life_2:entities:path_track]]'s, diese bekommen nun folgende Outputs:
  * **OnPass** - LogicCompare - SetValue "1" - 0.00 (Sobald der Aufzug vorbeifährt, wird der Wert des aktuellen Stockwerks in den LogicCompare Value "InitialValue" geschrieben)
  * **OnPass** - LogicCompare - Compare - 0.01 (0,01 Sekunden danach wird der LogicCompare getriggert, d.h. compared)

{{half-life_2:tutorials:fahrstuehle:3.jpg}}

Wenn der Aufzug also z.B. in Stockwerk 3 vorbeifährt, weiss der locig_compare, in welchem Stockwerk wir uns befinden und kann dementsprechend entscheiden, was der Aufzug tun soll.

Damit der [[source:entities:logic_compare]] aber wirklich weiss, was der Aufzug tun soll, muss er noch wissen, wo der Aufzug hin soll. Dies wiederum teilen wir dem locig_compare über [[source:entities:func_button]]'s im Aufzug und in jedem Stockwerk mit.

==== Die Aufzug-Schick-Schalter ====
Als erstes erstellen wir die Schalter im Aufzug, mit denen wir den Aufzug in die verschiedenen Stockwerke schicken können. Diese erzeugen wir im Aufzug an einer Aufzugwand und machen diese zum [[source:entities:func_button]]. Das ganze könnte so aussehen:
{{half-life_2:tutorials:fahrstuehle:4.jpg}}

  Nehmt aber nicht wie hier die SpriteTexturen für die Zahlen, sondern macht euch
  eine passende eigene Textur, da die Sprites auf Brushes zu visuellen Fehlern führen
  (man sieht den Sprite durch alle Mauern durch).

  * **Name**: ButS1Go (Der Name des Buttons. Ich habe meine Buttons nach dem Schema "But"-Stockwerk-Funktion benannt)
  * **Parent**: Lift (Dies ist nötig, um den Button immer mit dem Aufzug fahren zu lassen)
Flags:
  * **Don't Move** (Wenn der Button nicht in der Wand verschwinden soll, klickt dies einfach an)
  * **Use activates** (Der Button kann nur über den Use-Knopf getriggert werden)
Outputs:
  * **OnPressed** - LogicCompare - SetCompareValue "1" - 0.00 (Sobald der Button gedrückt wird, wird der Wert des Stockwerks in das wir fahren wollen in den LogicCompare Value "CompareValue" geschrieben)
  * **OnPressed** - LogicCompare - Compare - 0.01 (0,01 Sekunden danach wird der LogicCompare getriggert, d.h. compared)
  Achtung: Es gibt noch einen Input "SetValueCompare", der aber
  anscheinend nicht genauso funktioniert wie "SetCompareValue".
  Also aufpassen ;)

{{half-life_2:tutorials:fahrstuehle:5.jpg}}

Dadurch fährt der Aufzug los, sobald wir den Knopf im Aufzug drücken. Der [[source:entities:logic_compare]] sorgt dabei immer dafür, das wir im richtigen Stockwerk anhalten. Nun müssen wir nur noch entsprechende Buttons im Aufzug für die restlichen Stockwerke erstellen und mit den gleichen Werten wie oben versehen (natürlich mit den anderen Stockwerknummern). Nun können wir in jedes Stockwerk fahren.

==== Die Stockwerk-Ruf-Schalter ====
Danach möchten wir den aufzug natürlich auch aus jedem Stockwerk rufen können. Die Buttons haben dabei aber das gleiche Output-Schema wie die Aufzug-Schick-Schalter. Also erstellen wir in jedem Stockwerk einen Schalter, der den Aufzug ruft. Erstellt einfach einen Brush, belegt ihn mit einer Knopf-ähnlichen Textur und macht diesen Brush zum [[source:entities:func_button]] mit folgenden Einstellungen:
  * **Name**: ButS1Call (Der Name des Buttons. Ich habe meine Buttons nach dem Schema "But"-Stockwerk-Funktion benannt)
Flags:
  * **Don't Move** (Wenn der Button nicht in der Wand verschwinden soll, klickt dies einfach an)
  * **Use activates** (Der Button kann nur über den Use-Knopf getriggert werden)
Outputs:
  * **OnPressed** - LogicCompare - SetCompareValue "1" - 0.00 (Sobald der Button gedrückt wird, wird der Wert des aktuellen Stockwerks in den LogicCompare Value "CompareValue" geschrieben)
  * **OnPressed** - LogicCompare - Compare - 0.01 (0,01 Sekunden danach wird der LogicCompare getriggert, d.h. compared)

==== Türen und ähnliches ====
Durch diese Konstruktion kann man relativ einfach auch beim drücken des Knopfes im Aufzug eine Fahrstuhltür schliessen und beim "OnEqual" des [[source:entities:logic_compare]] wieder öffnen. Lasst euch einfach etwas einfallen.

==== Bekannte Probleme ====
Zwei Probleme sind mir bekannt:
  - Der Fahrstuhl ruckelt beim fahren sehr stark. Dies sieht aber nur so aus, wenn man sich IM Fahrstuhl befindet, von aussen sieht die Fahrt schön "weich" aus. Leider hilft auch ein ändern der Geschwindigkeit nicht wirklich.
  - Der Fahrstuhl hält in den Stockwerken nicht perfekt, da anscheinend die [[half-life_2:entities:path_track]]'s in dem Moment getriggert werden, in dem der Aufzug auf den unteren Teil des [[half-life_2:entities:path_track]]'s trifft. Da es bis zum [[source:entities:logic_compare]] 0.01 Sekunden dauert, hält der Aufzug nicht direkt in der Mitte an.

==== Beispiel Map ====
{{half-life_2:tutorials:fahrstuehle:lift.zip|Hier}} könnt ihr eine Beispielmap downloaden, in der das gesamte Tutorial aufgebaut ist.

===== Methode 2: Türen-Fahrstuhl =====

Um dem Fahrstuhl noch Türen hinzuzufügen, reicht es völlig aus, wenn man die Türen als [[source:entities:func_door]] einfach per "Parent" Eintrag an den Fahrstuhl bindet. So muss man sie nur noch beim Anhalten öffnen, und bei Abfahren wieder schliessen.
