====== Input/Output System ======
Wer kennt nicht den alten Half-life1 Eintrag "target", mit dem man mühsam immer nur ein bestimmtes Entitiy für eine bestimmte Aktion triggern konnte. Das sehr komplexe Input/Output System von Half-life² bietet sehr viel mehr Möglichkeiten.
Mithilfe dieser Systeme können alle Entities in den unterschiedliche Situationen verschiedene Entities triggern. 
Fast jedes Entity hat zwei Möglichkeiten mit anderen Entities zu kommunizieren. Es kann ein Output versenden oder ein Input empfangen. Ein Entity sendet z.B ein Onkilled Output (was bedeutet dass das Entity "gekillt" wurde) an ein anderes, das durch den Input eine bestimmte Sache ausführt. 

Das ist natürlich nicht nur mit dem Kill-Beispiel möglich, sondern mit vielen anderen Sachen. Wer jetzt die alte Half-life Methode noch kennt, möge vielleicht das hier helfen: Ein [[source:entities:trigger_once]] hat nicht mehr einfach ein ''target'', wenn man in den trigger hineinläuft, sondern  mehrere Outputs wie zum Beispiel ''OnStartTouch, OnTrigger oder OnEndTouch''. Unter anderem werden durch diese Methoden die bekannten (und bei manchen sicherlich verhassten :D ) [[half-life:entities:multi_manager]] nutzlos.

===== Outputs =====
Outputs sind ausgehende Signale, die von einem Entity gesendet werden, sobald sich sein Zustand ändert. Das kann ein gedrückter Knopf sein oder eine Tür die sich gerade fertig geschlossen hat. In dem **Outputs Tab** kann man neue Outputs festlegen und sieht auch alle schon bestehenden Outputs

{{half-life_2:tutorials:input_output:trigger.jpg}}


Drückt man auf **add**, fügt man einen neuen Output hinzu, aber ich denke das ist selbsterklärend.
Bei dem neuen Output gibt es dann unten mehrere Einstellmöglichkeiten:

  * **My Output named**: Wählt hier in der Liste den passenden Output, bei mir ist das OnTrigger, weil ich den Output auslösen will, sobald jemand in den Trigger hineinläuft, also ihn auslöst.
 
  * **Targets entities named**: Der [[half-life_2:entities:eigenschaften:targetname|Name des Entitys]], an den der Output gesendet wird. Hier können verschiedene Variablen für dynamische Targets gesetzt werden:
    * ''!player'' -  Der Spieler selbst. **!player** für Singeplayer, **Player** für alle Spieler im Multiplayer
    * ''!activator'' - Verlinkt auf das Entity, das den Output am ersten Entity ausgelöst hat.
    * ''!caller'' - Verlinkt wieder auf das erste Entity, das die Outputs veranlasst hat.
    * ''!self'' - Das Ziel ist das selbe Entity, in dem das Targetname angegeben wird
    * ''!pvsplayer'' - Das Ziel ist das erste Entity, das in dem aktiven [[glossar:PVS]] gefunden wird.
    * ''!speechtarget'' - Das Ziel ist ein Entity, das von dem Entity von dem der Output ausgeht, "angesehen" wird.
    * ''!picker'' - Das Ziel ist das Entity, das in diesem Moment vom Spieler angesehen wird. (Keine Non-Solid-Entities)

  * **Via this Input**: Das ist der Befehl, welchen das Entity (bei mir ''laser'') ausführen soll. Bei mir ist das TurnOn; somit wird der Laser aktiviert.

  * **After a delay in seconds of**: Wenn der Output nicht sofort gesendet werden soll, sondern nach x Sekunden (hier 0.5 Sekunden)

  * **Fire Once Only**: Ob der Output nur einmal abgegeben werden kann.

\\

Wenn das Zielentity vorhanden ist, erscheint der Text schwarz, sollte es das Entity nicht geben, bleibt der Text rot. Sobald der Output vollständig ist, ist links unten so ein schwarzer Pfeil. Am Anfang ist dort noch ein roter Balken durchgezogen, weil der Output noch nicht funktionierte. Wenn dieser Balken verschwindet, wisst ihr, dass der Output richtig funktioniert. Übrigens kommt ihr mit einem Klick auf diesem Pfeil zu eurem Zielentity.

===== Inputs =====

Bei dem  **Inputs Tab** werden alle hereinkommende Signale angezeigt.

{{half-life_2:tutorials:input_output:input.jpg}}

Mit einem Doppelklick auf den Eintrag springt man automatisch zu dem Entity, der den  Output sendet (hier der [[source:entities:trigger_once]]). Ist der Input rot angezeigt, funktioniert er nicht. Es gibt dann entweder den Output oder den Input nicht, deswegen gebt immer erst den Namen des Zielentities ein, und wählt **dann** den Eintrag aus. 


===== Debuggen der Verbindungen =====

==== Im Editor ====

Um zu überprüfen, ob alle Outputs/Inputs in Ordnung sind, drückt einfach mal **alt+p**, denn fehlerhafte Verbindungen werden dort angezeigt.

==== Ingame ====

Auch innerhalb des Spiels gibt es Möglichkeiten, die I/O's zu überprüfen. Dafür gibt es einige Consolenbefehle:

  * **ent_developer 2** - Dieser Befehl gibt einen ausführlichen Bericht über alle I/O-Verbindungen aus. Sehr hilfreich bei komplexen Verbindungen.
  * **ent_messages_draw 1** -  Vergleichbar mit dem ''ent_developer'' Befehl, allerdings stellt dieser Befehl die Verbindungen visuell dar. Dadurch bekommt der Benutzer ein besseres Bild.
  * **ent_fire (Name des Zielentity, Name des Inputs, Wert des Inputs)**  - Dieser Befehl erlaubt es, noch ingame Inputs zu feuern. Sehr hilfreich um die Einstellungen der Entities zu überprüfen.
  * **ent_pause**  - Dieser Befehl pausiert die gesamte Kommunikation zwischen Entities. Wenn der Befehl nochmal eingegeben wird, machen die Entities ganz normal weiter. Sehr hilfreich in Kombination mit dem ''env_step''-Befehl.
  * **ent_step** - Wenn dieser Befehl zusammen mit dem ''ent_pause''-Befehl benutzt wird, wird langsam nach und nach die Verbindungen durchgegangen. Der Benutzer kann mithilfe einer Ziffer hinter dem Befehl die Anzahl der Verbindungen, die auf einmal aufgebaut werden, bestimmtem (**ent_step 2** -> 2 Verbindungen auf einmal)

===== Querlinks / Verwandte Themen =====
  * [[half-life_2:entities:eigenschaften:io|Inputs/Outputs]] - Eine Liste verschiedener In- und Outputs und deren Definition.

===== Bemerkungen / Beispiele =====
  * Mit der Target-Variable ''!activator'' lässt sich zum Beispiel der Spieler, ein NPC, etc ansprechen, welcher eine Kiste zerstört. So könnte der Spieler oder NPC mit einem [[source:entities:env_entity_igniter]] angezündet werden, sobald die Kiste zerbricht.