HL²DM n'est pas prévu pour utiliser des NPC, ce qui pose pas mal de différences avec les NPC dans HL², solo.
Les NPC buggés
Certains NPC ne fonctionnent pas sous HL²DM. Généralement, quand vous en mettez un et qu'il ne fonctionne pas (après lui avoir défini une relation, (voir plus bas)), c'est qu'il n'est pas géré. La plupart des NPC courants sont évidemment générés, à l'exception des zombies.
Les zombies
Si vous mettez des zombies et que vous testez votre map, le jeu va planter. Les zombies ne fonctionnent que si la map est jouée sur un serveur tournant sous Linux. C'est con mais c'est comme ça. Si vous décidez de faire une map avec des zombies, il vous faudra obligatoirement un serveur Linux (que vous faites vous-même, ou bien un serveur dédié Linux). Si vous utilisez le Dedicated Serveur proposé via Steam, c'est un serveur Windows, pour comme tester sa ma en local directement avec HL²DM. C'est la raison pour laquelle il y a si peu de maps coop avec des zombies, c'est tout simplement casse pied pour tester.
L'amitié monstres - joueurs
Sous HL²DM, tous les NPC sont neutres. Comprenez, ceux qui sont normalement méchants n'attaquent pas le joueur. Il faut donc, pour chaque type de NPC, utiliser une entité
ai_relationship pour définir le comportement du NPC vis-à-vis du joueur.
Prenons l'exemple du headcrab. L'entité qui permet d'insérer un headcrab est
npc_headcrab. Créez une entité point
ai_relationship et définissez ses propriétés comme ceci :
- Name : ai_headcrab
- Subjects : npc_headcrab
- Targets : !player
- Disposition : Hate
- Start Active : No
- Reciprocal : Yes
Je définis donc que les
npc_headcab ne doivent pas aimer le joueur (
!player) et que c'est réciproque. La relation n'est pas active par défaut. Il est conseillé de l'appliquer au chargement de la map. Pour cela, rien de plus simple, un
logic_auto :
| Output named | Targets entities | Via this input | Parameter | Delay |
|---|
| OnMapSpawn |
ai_headcrab |
ApplyRelationship |
<none> |
0.00 |
A vous de créer les autres
ai_relationship, pour les autres NPC

.
Faire apparaitre les NPC
Il est grandement conseillé de toujours utiliser un
npc_template_maker pour faire apparaitre les NPC. Un
npc_template_maker est une entité qui fait apparaitre un NPC et qui a surtout la capacité d'en faire apparaitre plusieurs à la suite ou en même temps.
Faisons un exemple avec un headcrab. Créez une entité
npc_headcrab, et donnez-lui comme nom
template_headcrab. Ce
ncp_headcrab servira de base. C'est lui que les
npc_template_maker feront apparaitre.
L'entité
npc_headcrab ne demande pas de configuration spécifique, hormis au niveau des flags. Comme on va utiliser l'entité par le biais d'un
npc_template_maker, il va falloir l'indiquer. Pour cela, cochez le flag
Template NPC.
Le
npc_template_maker est assez simple à utiliser aussi. Il suffit de lui indiquer le NPC à faire apparaitre, combien de fois, et combien il peut y en avoir en vie en même temps :
- Num. of NPCs : le nombre de NPC total qui seront spawnés
- Frequency : la fréquence d'apparition, en secondes
- Max Live NPCs : le nombre de NPC en vie en même temps. Si vous laissez 1, le npc_template_maker attendra que celui qui vit soit tué avant de faire apparaitre le second
- Name of template NPC : le nom du NPC. Dans l'exemple, c'est template_headcrab
Le npc_template_maker doit être désactivé par défaut (Start active : No). Vous devez donc lui donner un nom pour l'appeler et ainsi l'activer. L'activation se fait via l'input
Enable. Ca permet aussi de ne faire apparaitre que les NPC que les joueurs vont voir. Inutile donc de faire apparaitre au chargement de la map l'antlion guard que les joueurs ne verront qu'à la fin du niveau.
| Output named | Targets entities | Via this input | Parameter | Delay |
|---|
| OnQuelqueChose |
maker_headcracb_1 |
Enable |
<none> |
0.00 |
L'entité possède aussi un flags
Infinite children. Il permet de faire apparaitre un NPC une infinité de fois (jusqu'à ce que le
npc_template_maker soit désactivé, avec l'input
Disable). Ce flag ne marche pas bien avec les
npc_manhack. Et de manière générale, on ne sait pas faire apparaitre plus d'une quinzaine de manhacks par
npc_template_maker.
Eh oui, le NPC que fait apparaitre ne
npc_template_maker apparait à sa place donc il ne doit pas toucher le seul pour éviter que le NPC ne se retrouve coincé.
Voici par exemple un "champ" de respawn pour headcrabs en folie (dans ma map
js_copp_thunder)

:
Paramétrer les NPC
Comme je l'ai déjà dit, les NPC dans HL²DM c'est pas toujours ça. Et pour cause, tirez une fois sur un monstre, hop, il est mort. En fait, il va falloir définir "à la main" la vie de chaque type de NPC, et les dommages qu'il provoque avec ses attaques.
Pour définir ces variables (ce sont des variables dédiées, pouvant être tapées dans la console en fait), on va se servir d'une entité
point_servercommand. Placez donc cette entité point, et donnez-lui comme nom
serveur.
Lors du chargement de la map, il va falloir définir ces variables. Pour cela, il suffit de faire un output vers l'entité
point_servercommand qui appliquera la variable. Je vous conseille de créer un
logic_relay qui ne contiendra que les outputs vers le
point_servercommand. Ce
logic_relay sera appelé au chargement de la map, avec le
logic_auto que nous avons créé pour établir les relations NCP - Joueurs.
Les outputs du
logic_relay sont de ce type :
| Output named | Targets entities | Via this input | Parameter | Delay |
|---|
| OnTrigger |
serveur |
Command |
sk_headcrab_health 50 |
0.00 |
| OnTrigger |
serveur |
Command |
sk_headcrab_fast_health 50 |
0.00 |
| OnTrigger |
serveur |
Command |
sk_headcrab_poison_health 50 |
0.00 |
Ces variables
sk sont différentes pour chaque type de NPC. Vous pouvez consulter le wiki de Valve.
Pour chaque entité, ces variables sont mentionnées

.
Voici une liste de variables que j'utilise :
Secret (cliquez pour afficher)Code : Autre1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| sk_headcrabs_health 100
sk_headcrab_melee_dmg 30
sk_headcrab_fast_health 200
sk_headcrab_poison_health 150
sk_zombie_poison_health 1000
sk_zombie_poison_dmg_spit 50
sk_zombie_health 200
sk_zombie_dmg_one_slash 50
sk_zombie_dmg_both_slash 80
sk_vortigaunt_dmg_claw 40
sk_vortigaunt_dmg_rake 50
sk_vortigaunt_dmg_zap 50
sk_vortigaunt_health 200
sk_manhack_health 100
sk_manhack_melee_dmg 25
sk_scaner_health 100
sk_antlionguard_health 5000
sk_antlionguard_dmg_shove 500
sk_antlionguard_dmg_charge 500
sk_antlion_health 1000
sk_zombie_fast_health 300
sk_gunship_health_increments 100
sk_antlion_jump_damage 500
sk_antlion_swipe_damage 500 |
Une dernière chose
Faites simple !!! Evitez les séquences de NPC avec par exemple des antlions qui respawnent quand le joueur marche sur le sable (ça ne marche pas), des antlions qui volent d'un point à un autre (avec ça, crash du serveur Linux garanti (bizarrement, ça marche sous Windows, le contraire des zombies quoi

))...
Contentez-vous d'utiliser un
path_corner pour indiquer la destination des NPC, ne vous compliquez pas la vie

.