Haradirki.de

Einen Aufzug erstellen:
Dateien: indextut38.zip

Anmerkung: Dieses Thema ist nur für Fortgeschrittene und aufwärts geeignet. Hier wird mit Entities und Outputs um sich geworfen. Daher bitte auf jeden Fall die Einführung in das Entity I/O System und das Thema über Plattformen erstellen lesen, da ihr hier sonst kein Land sehen werdet. Hier eine Übersicht über die Dateien, die sich im Zip-File zum Thema befinden:

indextut38namen.vmf die Map ohne die Outputs. Mit dieser Map wollen wir arbeiten.
   
indextut38fertig.vmf ist das Ergebnis dieses Themas.

In diesem Thema will ich dir zeigen, wie man einen Lift erstellt, der voll vom Spieler steuerbar ist. Der Lift wird über 3 Stockwerke gehen. Auf jedem Stockwerk soll der Lift über einen Knopf abrufbar sein. Türen sollen sich nur dann öffnen, wenn sich der Lift im gleichen Stockwerk befindet. Alle Knöpfe sollen leuchten, sobald man diese aktiviert. Im Lift selbst ist dann jedes Stockwerk über 3 Knöpfe anfahrbar. Jetzt heisst es aber "ran ans Werk!"

Bevor wir jedoch anfangen, will ich dir eine kleine Änderung zeigen, so dass dieses Thema nicht zu lange wird. Dazu habe ich die Outputs etwas vereinfacht. Bisher habe ich dir einen neuen Output so beschrieben:

My Output Named: OnPass
Targets Entities Named: aufzug_01
Via This Input: Stop
With A Parameter Override Of -
After A Delay In Seconds Of 0.00
Fire Once Only: No

In diesem Thema werde ich den selben neuen Output jedoch so beschreiben:

| OnPass | aufzug_01 | Stop | - | 0.00 | No |

Damit spare ich mir viel Platz und bei mehreren Outputs wird es auch nicht so schnell unübersichtlich. Um dir Arbeit zu ersparen, kannst du am besten die einzelnen Eingaben für die Outputs über Copy und Paste in den Hammer Editor einfügen. Nun fangen wir aber wirklich an:

Zunächst solltest du dir dazu die Zip-Datei zu diesem Thema herunterladen und die Datei "indextut38namen.vmf" im Hammer Editor laden. Hier habe ich schon alle Entities mit Namen ausgestattet und die Architektur aufgebaut. Hier mal ein Bild davon:

Map

Links siehst du die 3 Stockwerke, halb verdenkt im Hintergrund in weiss der Aufzug selbst. Ganz fein kann man auch den Pfad des Aufzugs in der Mitte des Lifts sehen. Kommen wir nun zu den Entities. Auf jedem Stockwerk befinden sich:

1x Entity "logic_compare"
2x Entity "func_door"
1x Entity "func_button"
1x Entity "light"
1x Entity "logic_relay"
1x Entity "logic_branch"

Am Aufzug befinden sich:

1x Entity "func_tracktrain"
3x Entity "light"
4x Entity "logic_branch"
3x Entity "logic_relay"
1x Entity "logic_compare"
3x Entity "path_track"

wir werden nun zuerst den Entities am Aufzug anfangen. Zunächst sehen wir uns dazu den Aufzug (Name: "aufzug_01") an:

func_tracktrain

Hier wollen wir nun ein paar Dinge einstellen. Zunächst zu den Keyvalues:

  • Keyvalue: "First Stop Target"
    Value: "stock_01"
  • Keyvalue: "Height above Track"
    Value: "0"

Dann zu den Flags:

[x] No Pitch (X-rot)
[x] No User Control

Diese Eingaben haben nun folgendes gebracht: Der erste Haltepunkt des Lifts ist der Path_track mit dem Namen "stock_01". Der Lift hält genau auf der Position des "Path_Track" Entities, d.h. es gibt später keinen Höhenunterschied zwischen dem Stockwerk und dem Aufzug. Die Flags bewirken, das sich der Aufzug nicht dreht und dass er nicht vom Spieler kontrolliert werden kann. Diese Funktion würde sonst nämlich bewirken, dass der Lift so an und abschaltbar ist wie die Züge in HL1. Das wollen wir hier nicht, der Aufzug soll nur über die Knöpfe bedienbar sein.

Nun wenden wir uns mal dem ersten "Path_Track" Entity namens "stock_01" zu. Dieses ist übrigens 16 Units groß und damit genau so dick wie der Aufzug auch. Daher können wir auch die Keyvalue von "Height above Track" auf "0" setzen, da diese genau gleich dick sind:

path_track

Hier wollen wir nun ein paar Dinge einstellen. Zunächst zu den Keyvalues:

  • Keyvalue: "Next Stop Target"
    Value: "stock_02"

Dann zu den Outputs:

| OnPass | logic | SetValueCompare | 1 | 0.00 | No |
| OnPass | logic_compare_door_01 | SetValue | 1 | 0.00 | No |

| OnPass | logic_compare_door_02 | SetValue | 1 | 0.00 | No |

| OnPass | logic_compare_door_03 | SetValue | 1 | 0.00 | No |

Und was bringen diese Angaben? Das "Path_Track" Entity haben wir nun mit dem nächsten "Path_Track" Entity verbunden. Die Outputs bedeuten, dass sobald der Aufzug dieses "Path_Track" Entity passiert, werden allen Entities gesagt, dass er sich im Stock_01 befindet.

Wenden wir uns dem nächsten "Path_Track" Entity mit dem Namen "stock_02" zu:

path Track Entity

auch hier wollen wir nun ein paar Dinge einstellen. Zunächst zu den Keyvalues:

  • Keyvalue: "Next Stop Target"
    Value: "stock_03"

Dann zu den Outputs:

| OnPass | logic | SetValueCompare | 2 | 0.00 | No |
| OnPass | logic_compare_door_01 | SetValue | 2 | 0.00 | No |

| OnPass | logic_compare_door_02 | SetValue | 2 | 0.00 | No |

| OnPass | logic_compare_door_03 | SetValue | 2 | 0.00 | No |

Und was bringen diese Angaben? Das "path_track" Entity haben wir nun mit dem nächsten "path_track" Entity verbunden. Die Outputs bedeuten, dass sobald der Aufzug dieses "path_track" Entity passiert, werden allen Entities gesagt, dass er sich im Stock_02 befindet.

Kommen wir nun zum letzten "path_track" mit dem Namen "stock_03":

Path_Track

auch wieder wollen wir nun ein paar Dinge einstellen. Zunächst zu den Keyvalues:

  • Keyvalue: "Next Stop Target"
    Value: "stock_01"

Dann zu den Outputs:

| OnPass | logic | SetValueCompare | 3 | 0.00 | No |
| OnPass | logic_compare_door_01 | SetValue | 3 | 0.00 | No |

| OnPass | logic_compare_door_02 | SetValue | 3 | 0.00 | No |

| OnPass | logic_compare_door_03 | SetValue | 3 | 0.00 | No |

Und was bringen diese Angaben? Das "path_track" Entity haben wir nun mit dem ersten "path_track" Entity ganz unten am Boden verbunden. Damit entsteht nun eine Endlosschleife, oder ein "loop". Damit hätten wir das geschafft, nun wenden wir uns mal den Entities zu, die sich am Aufzug befinden. Starten wir mit den Lichtern. Wir fangen mit dem untersten an:

light

Hier wollen wir nun etwas einstellen, nämlich eine Einstellung bei den Flags:

[x] Initially Dark

Nun kommen wir zu den anderen beiden Lichtern. Hier wählst du auch jeweils bei den Flags [x] Initially Dark an. Dann hätten wir auch schon die Lichter geschafft. Nun kommen die func_buttons. Wir fangen wieder mit dem untersten an:

func_button

und wieder wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Delay Before Reset"
  • Value: "3"

dann bei den Flags:

[x] Don't Move

Dann zu den Outputs:

| OnPressed | logic_branch_01_aufzug_01 | SetValueTest | 1 | 0.00 | No |
| OnPressed | logic_branch_02_aufzug_01 | SetValueTest | 0 | 0.00 | No |
| OnPressed | logic_branch_03_aufzug_01 | SetValueTest | 0 | 0.00 | No |

Das gleiche machen wir nun bei dem zweiten Button, also auch wieder die Keyvalue und bei Flags [x] Don't Move einstellen, dann aber für den mittleren Button die Outputs:

| OnPressed | logic_branch_01_aufzug_01 | SetValueTest | 0 | 0.00 | No |
| OnPressed | logic_branch_02_aufzug_01 | SetValueTest | 1 | 0.00 | No |
| OnPressed | logic_branch_03_aufzug_01 | SetValueTest | 0 | 0.00 | No |

und für den oberen Button die folgenden Outputs:

| OnPressed | logic_branch_01_aufzug_01 | SetValueTest | 0 | 0.00 | No |
| OnPressed | logic_branch_02_aufzug_01 | SetValueTest | 0 | 0.00 | No |
| OnPressed | logic_branch_03_aufzug_01 | SetValueTest | 1 | 0.00 | No |

Und was bringt das? Ganz einfach, der unterste Knopf ist somit für den stock_01 zuständig, der mittlere Knopf für den stock_02 und der obere Button für den stock_03. Alle 3 Knöpfe bewegen sich aber nicht, wenn sie gedrückt werden. Diese sollen ja nämlich beleuchtet werden, aber dazu später.

Nun kommen wir zu dem untersten logic_branch:

logic_branch

und wieder wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Initial Value"
  • Value: "0"

Dann zu den Outputs:

| OnFalse | logic_branch_02_aufzug_01 | Test | - | 0.00 | No |
| OnFalse | licht_01_aufzug_01 | TurnOff | - | 0.00 | No |
| OnTrue | logic_relay_01_aufzug_01 | Trigger | - | 0.00 | No |
| OnTrue | licht_01_aufzug_01 | TurnOn | - | 0.00 | No |
| OnTrue | logic_branch_02_aufzug_01 | Test | - | 0.05 | No |

Nun folgt das gleiche wieder bei den beiden anderen logic_branch. Also beim mittleren (zweiten) logic_branch auch wieder die Keyvalue "Initial State" auf "0" setzen und bei den Outputs folgendes eintragen:

| OnFalse | logic_branch_03_aufzug_01 | Test | - | 0.00 | No |
| OnFalse | licht_02_aufzug_01 | TurnOff | - | 0.00 | No |
| OnTrue | logic_relay_02_aufzug_01 | Trigger | - | 0.00 | No |
| OnTrue | licht_02_aufzug_01 | TurnOn | - | 0.00 | No |
| OnTrue | logic_branch_03_aufzug_01 | Test | - | 0.05 | No |

beim oberen (dritten) logic_branch die Keyvalue "Initial State" auf "0" setzen und bei den Outputs folgendes eintragen:

| OnFalse | licht_03_aufzug_01 | TurnOff | - | 0.00 | No |
| OnTrue | logic_relay_03_aufzug_01 | Trigger | - | 0.00 | No |
| OnTrue | licht_03_aufzug_01 | TurnOn | - | 0.00 | No |

Jetzt folgt die nächste Reihe, beginnen wir mit dem unteren "logic_relay":

logic_relay

und wieder wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Start Disabled"
  • Value: "No"

Dann zu den Outputs:

| OnTrigger | logic | SetCompareValue | 1 | 0.00 | No |
| OnTrigger | input | SetValueTest | 0 | 0.01 | No |
| OnTrigger | logic | compare | - | 1.00 | No |

Nun folgt das gleiche wieder bei den beiden anderen logic_relay. Also beim mittleren (zweiten) logic_relay auch wieder die Keyvalue "Start Disabled" auf "No" setzen und bei den Outputs folgendes eintragen:

| OnTrigger | logic | SetCompareValue | 2 | 0.00 | No |
| OnTrigger | input | SetValueTest | 0 | 0.01 | No |
| OnTrigger | logic | compare | - | 1.00 | No |

beim oberen (dritten) logic_branch die Keyvalue "Start Disabled" auf "No" setzen und bei den Outputs folgendes eintragen:

| OnTrigger | logic | SetCompareValue | 3 | 0.00 | No |
| OnTrigger | input | SetValueTest | 0 | 0.01 | No |
| OnTrigger | logic | compare | - | 1.00 | No |

Kommen wir nun zu dem ersten großen Entity, dem logic_compare mit dem Namen "logic":

logic_compare

... wieder wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Initial Value"
    Value: "1"
  • Keyvalue: "Compare Value"
    Value: "1"

Dann zu den Outputs:

| OnEqualTo | aufzug_01 | Stop | - | 0.00 | No |
| OnEqualTo | logic_compare_door_01 | compare | - | 0.50 | No |
| OnEqualTo | logic_compare_door_02 | compare | - | 0.50 | No |
| OnEqualTo | logic_compare_door_03 | compare | - | 0.50 | No |
| OnGreaterThan | aufzug_01 | StartBackward | - | 0.00 | No |
| OnLessThan | aufzug_01 | StartForward | - | 0.00 | No |

Noch ein Entity, dann hätten wir die Hälfte geschaft. Nun klicken wir das oberste Entity logic_branch an:

logic_branch

... und auch hier wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Initial Value"
    Value: "1"

Dann zu den Outputs:

| OnFalse | logic_relay_03_aufzug_01 | Disable | - | 0.00 | No |
| OnFalse | logic_relay_02_aufzug_01 | Disable | - | 0.00 | No |
| OnFalse | logic_relay_01_aufzug_01 | Disable | - | 0.00 | No |
| OnFalse | logic_relay_03_door | Disable | - | 0.00 | No |
| OnFalse | logic_relay_02_door | Disable | - | 0.00 | No |
| OnFalse | logic_relay_01_door | Disable | - | 0.00 | No |
| OnTrue | logic_relay_03_aufzug_01 | Enable | - | 0.00 | No |
| OnTrue | logic_relay_02_aufzug_01 | Enable | - | 0.00 | No |
| OnTrue | logic_relay_01_aufzug_01 | Enable | - | 0.00 | No |
| OnTrue | logic_relay_03_door | Enable | - | 0.00 | No |
| OnTrue | logic_relay_02_door | Enable | - | 0.00 | No |
| OnTrue | logic_relay_01_door | Enable | - | 0.00 | No |

So, jetzt kommen wir zu den logic_compare Entities die sich jeweils vor den Türen befinden. Wir fangen wieder bei dem untersten an:

logic_compare

... wieder wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Initial Value"
    Value: "1"
  • Keyvalue: "Compare Value"
    Value: "1"

Dann zu den Outputs:

| OnEqualTo | door_01_links | open | - | 0.00 | No |
| OnEqualTo | door_01_rechts | open | - | 0.00 | No |

bei dem mittleren logic_compare benutzt du dann die folgenden Keyvalues:

  • Keyvalue: "Initial Value"
    Value: "1"
  • Keyvalue: "Compare Value"
    Value: "2"

| OnEqualTo | door_02_links | open | - | 0.00 | No |
| OnEqualTo | door_02_rechts | open | - | 0.00 | No |

und beim obersten logic_compare nimmst du dann die folgenden Keyvalues:

  • Keyvalue: "Initial Value"
    Value: "1"
  • Keyvalue: "Compare Value"
    Value: "3"

| OnEqualTo | door_03_links | open | - | 0.00 | No |
| OnEqualTo | door_03_rechts | open | - | 0.00 | No |

So, jetzt kommen nur noch die Türen, hier interessiert und aber jeweils nur die linke Seite (vom Stockwerk aus gesehen) der Türe. Wir fangen wieder unten an:

func_door

... und auch hier wollen wir nun ein paar Keyvalues einstellen:

  • Keyvalue: "Delay Before Reset"
    Value: "4"

und die folgenden Outputs eingeben:

| OnClose | input | SetValueTest | 1 | 0.00 | no |
| OnClose | logic_branch_01_door_01 | SetValue | 0 | 0.00 | No
| OnClose | logic_branch_01_aufzug_01 | SetValue | 0 | 0.00 | No
| OnFullyClosed | logic_branch_01_aufzug_01 | SetValue | 0 | 0.01 | No |

| OnFullyClosed | logic_branch_01_door_01 | Test | - | 0.50 | No |

kommen wir gleich zur Türe im stock_02. Hier geben wir wieder die gleiche Keyvalue "4" bei "Delay Before Reset" ein und dann die folgenden Outputs:

| OnClose | input | SetValueTest | 1 | 0.00 | No |
| OnClose | logic_branch_02_door_02 | SetValue | 0 | 0.00 | No |
| OnClose | logic_branch_02_aufzug_01 | SetValue | 0 | 0.00 | No |
| OnFullyClosed | logic_branch_01_aufzug_01 | Test | - | 0.01 | No |
| OnFullyClosed | logic_branch_01_door_01 | Test | 0.50 | No |

Dann noch die Türe im stock_03. Hier geben wir auch wieder die gleiche Keyvalue "4" bei "Delay Before Reset" ein und dann die folgenden Outputs:

| OnClose | input | SetValueTest | 1 | 0.00 | No |
| OnClose | logic_branch_03_door_03 | SetValue | 0 | 0.00 | No |
| OnClose | logic_branch_03_aufzug_01 | SetValue | 0 | 0.00 | No |
| OnFullyClosed | logic_branch_01_aufzug_01 | Test | - | 0.01 | No |
| OnFullyClosed | logic_branch_01_door_01 | Test | - 0.50 | No |

So, dann sind wir ja schon hinter der Türe angelangt und noch 4 Entities fehlen uns noch. Fangen wir mit den func_buttons an, beginnen wir wieder mit dem untersten:

func_button

Und wieder tätigen wir ein paar Einstellungen. Bei den Flags müssen wir wie bei allen Buttons [x] don't move aktivieren und dann einen Output erstellen:

| OnPressed | logic_branch_01_door_01 | SetValueTest | 1 | 0.00 | No |

Das gleiche machen wir nun bei den restlichen beiden func_buttons in stock_02 mit dem folgenden Output:

| OnPressed | logic_branch_02_door_02 | SetValueTest | 1 | 0.00 | No |

und stock_03:

| OnPressed | logic_branch_03_door_03 | SetValueTest | 1 | 0.00 | No |

Die Lichter in den 3 Stockwerken sind relativ einfach einzustellen. Hier aktivieren wir nur bei den Flags den Punkt "[x] Initially Dark", damit sind die Lichter zu Beginn der Map ausgeschaltet.

Nun kommen wir zur zweitletzten Entity-Gruppe, den logic_relay. Auch hier arbeiten wir uns wieder von unten nach oben durch:

logic_relay

und wieder wollen wir nun ein paar Dinge einstellen. Zunächst eine Keyvalue:

  • Keyvalue: "Start Disabled"
  • Value: "No"

Dann zu den Outputs:

| OnTrigger | logic | SetCompareValue | 1 | 0.00 | No |
| OnTrigger | input | SetValueTest | 0 | 0.00 | No |
| OnTrigger | logic | compare | - | 0.01 | No |

auch hier erledigen wir gleich die beiden logic_relay in den oberen Stockwerken. Die Keyvalue mit "Start Disabled" und der Value von "No" bleibt gleich, jedoch ändern sich die Outputs. Für das Entity im stock_02 lauten diese Outputs dann:

| OnTrigger | logic | SetCompareValue | 2 | 0.00 | No |
| OnTrigger | input | SetValueTest | 0 | 0.00 | No |
| OnTrigger | logic | compare | - | 0.01 | No |

und im oberen Stockwerk stock_03 tragen wir noch die folgenden Outputs ein:

| OnTrigger | logic | SetCompareValue | 3 | 0.00 | No |
| OnTrigger | input | SetValueTest | 0 | 0.00 | No |
| OnTrigger | logic | compare | - | 0.01 | No |

So, jetzt folgt noch ein letzter Kraftakt, dann hätten wir das Thema geschafft. Widmen wir uns dazu der Entity Gruppe logic_branch. Dabei fangen wir wie immer bei dem untersten an:

logic_branch

Keyvalue: "Start Disabled"
Value: "no"

kommen wir noch gleich zu den Outputs:

| OnFalse | logic_branch_02_door_02 | Test | - | 0.00 | No |
| OnFalse | licht_01_button_01 | TurnOff | - | 0.00 | No |
| OnTrue | logic_relay_01_door_01 | Trigger | - | 0.00 | No |
| OnTrue | licht_01_button_01 | TurnOn | - | 0.00 | No |
| OnTrue | logic_branch_02_door_02 | Test | 0.05 | No |

die Keyvalue ändern wir genauso bei den beiden oberen logic_branch, die Ouputs für das zweite logic_branch lauten:

| OnFalse | logic_branch_03_door_03 | Test | - | 0.00 | No |
| OnFalse | licht_02_button_02 | TurnOff | - | 0.00 | No |
| OnTrue | logic_relay_02_door_02 | Trigger | - | 0.00 | No |
| OnTrue | licht_02_button_02 | TurnOn | - | 0.00 | No |
| OnTrue | logic_branch_03_door_03 | Test | 0.05 | No |

Da die jeweiligen Outputs die hier noch auf 03 lauten natürlich im dritten Stock nicht mehr benötigt werden, sind es hier nur noch 3 Outputs:

| OnFalse | licht_03_button_03 | TurnOff | - | 0.00 | No |
| OnTrue | logic_relay_03_door_03 | Trigger | - | 0.00 | No |
| OnTrue | licht_03_button_03 | TurnOn | - | 0.00 | No |

Somit hätten wir das Thema geschafft!

 

zurück zur Hauptseite

Half-Life 2 Hammer Tutorial, Copyright (c) 2005 Dirk "Haradirki" Marmann, erstellt mit Wordpad

Dieses Tutorial ist grundsätzlich Freeware und darf für den persönlichen Gebrauch weiterkopiert werden. Es darf allerdings NICHT ohne meine Einverständniss auf anderen Homepages als HTML-Datei oder zum Download angeboten werden. Es darf nichts hinzugefügt, verändert oder gelöscht werden. Weiterhin darf es nicht auf digitalen Medien, z.B. CD-Medien veröffentlicht werden, wenn ich nicht ausdrücklich meine Einverständniss dazu gegeben habe. Alle Rechte bleiben beim Autoren. Wird aus diesem Tutorial zitiert, währe ich sehr dankbar, wenn ihr dabei auf eine meiner beiden Homepages http://www.haradirki.de oder http://www.dead-in-bed.net hinweisst.

 

http://www.haradirki.de   http://www.dead-in-bed.net