Hi,
nachdem ich einige Zeit hier im Forum inaktiv war, habe ich mich entschieden wieder mit dem mapping anzufangen, und als Einstieg gleich mal mein zweites Tutorial zu verfassen.
Diesmal handelt das Thema vom "env_player_surface_trigger"-Entity. Dieses Entity kann manchmal äußerst nützlich sein, und zudem ist es nicht besonders kompliziert.
Mit diesem Entity kann man ein oder mehrere Ereignisse auslösen, wenn der Spieler einen bestimmten Untergrund (sand, Holz, Glas, etc) berührt.
Simples Anwendungsbeispiel:
Alle, die den HL²-SP gespielt haben, werden sich sicher noch mit Freuden (:D) an das Level "Sandtraps" erinnern. In diesem Level musste man möglichst den Sand umgehen, denn andernfalls, wenn man den Sand berührte, kamen sofort vier bis fünf Antlions aus dem Sand gekrochen und haben den Spieler angegriffen.

Genau anhand dieses Beispiels möchte ich euch das Entity nun erklären:
Los geht's:
Erstmal braucht ihr natürlich eine Umgebung (Ein Raum, o.ä.) und einen Startpunkt.

Gleich zu Anfang setzen wir das wichtigste Entity: Das env_player_surface_trigger
Dieses Entity triggert bestimmte Ereignisse, sobald der Spieler eine bestimmte Oberfläche berührt.
Dort nehmen wir folgende Einstellungen vor:
Name: surface_trigger
Game Material to Watch: Sand
Wie ihr seht, habe ich hier in meinem Beispiel als "Game Material to Watch", "Sand" ausgewählt. Sobald der Spieler einen Brush berühren würde, welcher mit einer Sandtextur belegt ist, würde der Output "OnSurfaceChangedToTarget" getriggert werden. Wenn der Spieler den Sandboden wieder verlassen würde, würde der Output "OnSurfaceChangedFromTarget" getriggert werden.
Wenn ihr euch nicht sicher seit, welches Material eure Textur besitzt, schaut einfach in der .vmt-Datei der Textur nach. Es steht hinter dem Eintrag "$surfaceprop". Wenn das Material einer Textur also Sand ist, würde in der .vmt "'$surfaceprop' 'sand'" oder "'$surfaceprop' 'antlionsand'" stehen.


Aber nun zurück zum env_player_surface_trigger.
Nachdem ihr die Einstellungen vorgenommen habt, kommen wir zu den Outputs:
My output named: OnSurfaceChangedToTarget (Sobald der Spieler die Oberfläche, welche wir zuvor in den Einstellungen eingestellt haben, berührt...)
Targets entities named: antlionspawn_relay (...soll das "antlionspawn_relay" (Dazu kommen wir später)...)
Via this input: Trigger (...getriggert werden.)
Und diesen Output:
My output named: OnSurfaceChangedFromTarget (Wenn der Spieler die Oberfläche verlässt (also eine andere Oberfläche als die eingestellte betritt),...)
Targets entities named: antliondespawn_relay (... soll das "antliondespawn_relay" (Dazu kommen wir auch später ^^)...)
Via this input: Trigger (... getriggert werden.)

Je nachdem was ihr triggern wollt, müsst ihr die Outputs eben euren Wünschen entsprechend anpassen.
Nun brauchen wir noch ein "npc_antlion" und ein "npc_antlion_template_maker" Entity für unser Beispiel.
Einstellungen des npc_antlion:
Name: Antlion
Start Burrowed: Yes (Da die Antlions zu Beginn noch eingebuddelt sein sollen)
und bei den Flags macht ihr noch einen Hacken bei "Template NPC".
Einstellungen des npc_antlion_template_maker:
Name: Antlion_spawner
Start Disabled: Yes
Frequency: .35 (Die Antlions sollen im Abstand von 0.35 Sekunden spawnen)
Max Live NPCs: 4 (Es sollen immer nur 4 Antlions da sein)
Name of template NPC: antlion (Name des npc_antlion-Entities)
Spawn on hint group: antlion_hintspawngroup (Dazu kommen wir später)
Spawn Target: !player (Die Antlions sollten möglicht nahe beim Spieler spawnen)
bei den Flags noch ein Hacken bei "Infinite Children".
Jetzt brauchen wir noch zwei Logic_relay's.
Beim ersten stellt ihr als namen "antlionspawn_relay" ein und erstellt diese Outputs:
My output named: OnTrigger (Wenn das logic_relay getriggert wird,...)
Targets entities named: antlion_spawner (...soll dass "antlion_spawner"...)
Via this input: enable (...aktiviert werden...)
After a delay in seconds of: 1.00 (...aber erst nach einer Sekunde...)
und
My output named: OnTrigger (Wenn das logic_relay getrigger wird,...)
Targets entities named: antliondespawn_relay (...soll dass "antliondespawn_relay"...)
Via this input: CancelPending (...gestoppt werden.)

beim zweiten logic_relay macht ihr als namen "antliondespawn_relay" und erstellt diese Outputs:
My output named: OnTrigger (Wenn das logic_relay getrigger wird,...)
Targets entities named: antlion_spawner (...soll dass "antlion_spawner"...)
Via this input: disable (...deaktiviert werden.)
und
My output named: OnTrigger (Wenn das logic_relay getrigger wird,...)
Targets entities named: antlionspawn_relay (...soll dass "antlionspawn_relay"...)
Via this input: CancelPending (...gestoppt werden.)
Das "CanclePending" dient dazu, dass keine Antlions gespawnt werden, wenn der Spieler sich kürzer als eine Sekunde auf dem Sandboden befindet, und sofort wieder auch eine andere Oberfläche tritt.

Jetzt sind wir schon fast fertig.
Nun brauchen wir nur noch ein paar info_nodes und ein paar info_node_hints.
Die info_nodes platziert ihr am besten überall in der map, wo sich NPCs bewegen können. Npc_nodes sind eine Art Orientierungshilfe für die npc's.
Die info_node_hints platziert ihr überall dorthin, wo die Antlions spawnen können sollen. Damit es realistisch ist, solltet ihr sie am besten über dem Sandboden platzieren. Bei den info_node_hints stellt ihr jeweils ein:
Hint: Antlion: Burrow Point (Das bedeutet, dass sich Antlions an diesem Punkt aus-, oder einbuddeln können.
Hint Group: antlion_hintspawngroup (Dadurch werden die Antlions nur auf info_node_hint's spawnen, die in der Hint Group "antlion_hintspawngroup" sind.)

So, und damit habt ihr es geschafft!
Sobald nun ein Spieler einen Brush betritt, der das Material "Sand" hat, werden an allen info_node_hints, die sich am nähesten beim Spieler befinden, Antlions aus dem Boden "kriechen".
Getestet habe ich das Entity env_player_surface_trigger nur im HL² SP, aber es sollte auch in CS: S und HL2: MP funktionieren.
Zum besseren Verständnis solltet ihr euch auf jeden Fall die Beispielmap anschauen, und bei Fragen fragt einfach hier nach!
Beispielmap könnt ihr euch hier herunterladen.
MfG,
Silver