Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Je vais vous apprendre ici à faire en sorte qu'un NPC ennemi, le
npc_metropolice monte la garde devant une porte et vous repousse si vous vous approchez de trop près.
Quoi! Tu veux nous apprendre à transformer un NPC en chien de garde, mais on n'est pas dans la partie sur le combat?
Si mais c'est le calme avant la tempête

.
Pour réaliser cela il nous faut:
- un npc_metropolice: c'est le NPC qui montera la garde.
- un ai_goal_police: pour indiquer au NPC la zone à garder.
- un trigger_once: pour déclencher tout cela.
Maintenant imaginez que vous avez un passage à faire garder par un NPC:
Il faut placer l'
ai_goal_police juste devant la porte et le
npc_metropolice pas trop loin:
Configuration
Commençons par le
npc_metropolice: il suffit juste de lui donner un nom grâce au champ
Name(par exemple cop1) et de lui donner comme arme la matraque électrique grâce au champ
Weapons: Stun Stick.
C'est en fait l'entité
ai_goal_police qui est importante, elle marque la zone à garder.
| Champ | Valeur |
|---|
| Name |
poste1 |
| Pitch Yaw Roll |
il faut orienter l'entité car c'est elle qui oriente le NPC |
| Radius |
le rayon de la zone à garder (ici 32) |
| Target |
!player |
Il ne reste plus qu'à déclencher tout cela à l'aide d'un
trigger_once. Allez dans l'onglet
Outputs et entrer ces deux lignes de commandes (je vais vous expliquez à quoi elles servent juste après

).
| My output named | Targets entities named | Via this input | With a parameter override of |
|---|
| On Trigger |
cop1 |
SetPoliceGoal |
poste1 |
| On Trigger |
poste1 |
DisableKnockOut |
<none> |
Et comme je suis très gentil (et surtout parce qu'on est sur le Site du Zéro

) je vous montre ce que vous devez obtenir au final:
Explications
La première ligne d'instructions va faire en sorte que lorsque vous déclenchez le
trigger_once, le
npc_metropolice tienne compte de l'
ai_goal_police et donc il va se diriger vers celui ci pour monter la garde.
La deuxième ligne d'instructions désactive le KO du
npc_metropolice, il vous frappera mais vous ne serez pas KO tout de suite.
Au bout d'un moment, à force de vous faire frapper, le NPC vous tuera: pour éviter cela on utilise l'entité env_global donc je vous expliquerai son fonctionnement en détail dans la 2ème partie.
L'ai_goal_police ne marche qu'avec le npc_metropolice.
Pour faire en sorte que les autres NPCs hostiles vous laissent tranquille, il faut utiliser une autres entité: l'
ai_relation_ship.
On y arrive enfin, je vais vous apprendre maintenant à faire en sorte que des NPC qui par défaut sont amis deviennent des ennemis et inversement. Pour cela une seule entité suffit:
ai_relationship
Voyons comment l'utiliser en fonction de ce que l'on veut faire: On va faire en sorte que un
npc_citoyen et un
npc_combine_s soient amis (par défaut ils sont ennemis). On les appellera
citoyen1 et
combi1 pour faire simple.
Dans l'onglet Class Info: voyons ce qui nous intéresse: il y a les champs
Subjects, Targets et
Disposition.
Les champs
Subjects et
Targets sont utilisés pour entrer le nom des NPC ciblés par le champ
Disposition. Pour ce champ on a 4 choix:
- Hate: le NPC subject détestera le NPC target et voudra le tuer.
- Fear: le NPC subject aura peur du NPC target et voudra fuir.
- Like: le NPC subject sera ami avec le NPC target (et lui obéira si c'est le joueur).
- Neutral: le NPC subject et le NPC target s'ignoreront.
Ensuite le champ
Reciprocal permet de faire en sorte que cette relation soit réciproque.
Pour finir, revenons sur notre exemple: c'est très simple à faire, il suffit d'un seul
ai_relationship pour que ces deux joyeux drilles soient amis. On utilisera la
Disposition Like et on mettra
Reciprocal sur Yes.
| Champ | Valeur |
|---|
| Subject(s) |
citoyen1 |
| Target(s) |
combi1 |
| Disposition |
Like |
| Start Active |
Yes |
| Reciprocal |
Yes |
Voilà, il existe une infinité de combinaison avec cette entité, on peut même réaliser un mod grâce à elle (Combine Destiny pour ceux qui ne le connaissent pas).
On va maintenant passer à la partie qui vous intéresse tous: comment faire pour que les NPCs chargent ? En fait il suffit juste de créer une ligne d'assaut et le tour est joué

. Pour cela il nous faut:
- Un npc_combine_soldier: je vous explique pas pourquoi vous êtes grands
.
- Un ai_goal_assault: il sert à configurer l'assaut.
- Un assault_rallypoint: c'est le point de départ de l'assaut.
- Plusieurs assault_assaultpoint: ils sont utilisés pour baliser le chemin.
- Un trigger_once: pour déclencher l'assaut.
Les assauts fonctionnent un peu comme les patrouilles avec les path_corner mais en plus compliqué.
Si vous êtes déjà allé sur le Wiki de Valve, vous avez sûrement vu ce schéma incompréhensible à première vue

.
Il résume de manière succincte ce qui va se passer: un
trigger déclenche un
ai_goal_assault qui va envoyer un message à un NPC précis et va lui demander de se diriger vers l'
assault_rallypoint de départ. Ce dernier pointe vers un
assault_assaultpoint vers lequel va se diriger le NPC et ainsi de suite (rassurez vous, je vais tout vous expliquez en détail

).
Configuration
Commençons par tracer le chemin pour l'assaut: le point de départ est un
assault_rallypoint: il faut lui donner un nom et lui donner le nom de l'
assault_assaultpoint suivant:
| Champ | Valeur |
|---|
| Name |
depart |
| Assault Point |
as1 |
Ensuite pour chaque
assault_assaultpoint, il faut leur donner un nom et leur donner le nom du prochain
assault_assaultpoint. Mais en fait c'est un peu plus compliqué: lorsque le NPC arrive à un
assault_assaultpoint, il a 2 choix:
- Soit le point est clear et il continue jusqu'au point suivant.
- Soit le point n'est pas clear et il s'y arrête jusqu'à ce qu'il soit clear.
Donc nous ici on veut que le NPC charge sans jamais s'arrêter, il suffit que tous les
assault_assaultpoint soient
clear dès qu'il y arrive. Pour cela on coche le
Flag: Clear this point upon arrival.
Notre chemin d'assaut est tracé, passons au déclenchement de cet assaut: pour le NPC c'est simple, il faut juste lui donner un nom (exemple: go1), mais pour l'
ai_goal_assault c'est juste une question de logique
| Champ | Valeur | Fonction |
|---|
| Name |
tri_depart |
Il faut lui donner un nom pour pouvoir le déclencher par un trigger |
| Actor(s) to affect |
go1 |
C'est le nom du NPC qui doit charger |
| Rally point Set |
depart |
C'est le nom de l' assault_rallypoint vers lequel le NPC doit se diriger |
| Start Active |
No |
Pour éviter que le NPC ne charge au lancement de la map |
Ensuite il ne reste plus qu'à déclencher le tout par un trigger:
| My output named | Targets entities named | Via this input |
|---|
| On Trigger |
tri_depart |
Activate |
Et voilà

c'est fini. Pour rendre vos assauts plus crédibles, il est préférable de faire plusieurs lignes d'assauts parallèles: cela donnera l'impression que vos NPC chargent par vagues.