Defining the NPC: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
mNo edit summary
mNo edit summary
 
(8 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{lang|Defining_the_NPC}}
{{npc tut}}
{{npc tut}}
To start your NPC, you must create a definition for it first.
This page covers '''creating a simple NPC''' using the SDK's template.


#Copy [[npc_New.cpp]] to a new file related to the classname. (In Orange Box Engine, The file is now called "monster_dummy")<br>Example: <code>src\dlls\hl2_dll\npc_Barney.cpp</code>
== Setting up ==
#Make appropriate changes to the <code>Precache</code>, <code>Spawn</code>, and <code>Classify</code> functions. <code>Precache</code> should include calls to <code>UTIL_PrecacheOther</code> for all entities this NPC creates as well as <code>PrecacheScriptSound</code> for all script sounds this NPC emits. Follow the subprocedure below if you want a custom class for the NPC.
## Add the new class to the first enum <code>Class_T</code> in <code>src\dlls\BaseEntity.h</code> before <code>NUM_AI_CLASSES</code>.{{note|This modification will require a rebuild of the server solution because <code>BaseEntity.h</code> is included in <code>cbase.h</code>}}Example class: <code>CLASS_COMBINE</code>
##Navigate to your gamerules file (<code>src\game_shared\hl2_gamerules.cpp</code>) and go to [[InitDefaultAIRelationships]].
##Copy one of the blocks of [[SetDefaultRelationship]] with a uniform first parameter (i.e. the first block: <code>CLASS_ANTLION</code>) and paste it at the end of the function.
##Replace the first parameter of the pasted code with your new class from <code>Class_T</code>.
##Change the disposition (i.e. D_NU) to the desired one from enum <code>Disposition_t</code> in <code>src\dlls\BaseCombatCharacter.h</code>.
##Change the priority (i.e. 0) of the relationship to the desired one.{{note|A higher priority means this NPC will pay the most attention to the target class.}}
##Go through every block of [[SetDefaultRelationship]] and add the new class to it as the second parameter.
#Note the '''AI_BEGIN_CUSTOM_NPC''' section.  This will be an important section for later steps.


{{navbar-first|Creating an NPC|Giving an NPC Memory}}
All versions of the SDK (including Alien Swarm) provide a NPC template file at <code>server/hl2/monster_dummy.cpp</code>. You can copy this file to a new location and start working on it.
 
Change the model path in <code>Precache()</code> and <code>Spawn()</code> to a valid model file (choose something humanoid for now) and you will be able to spawn a NPC which turns to face sounds it hears nearby.
 
== Relationships ==
 
:''This section targets the {{as|4.1}} codebase.''
 
An NPC's relationships define how it reacts to other NPCs. Use each NPC's <code>FindEntityRelationship(CBaseEntity *pTarget)</code> function to test the relationship state.
 
=== Dispositions ===
 
There are four built-in "dispositions":
 
* <code>D_HATE</code>
* <code>D_FEAR</code>
* <code>D_LIKE</code>
* <code>D_NEUTRAL</code>
 
Each relationship has a priority. The relationship with the highest priority wins if there is a conflict.
 
=== Targets ===
 
A relationship can target one of three things:
 
==== Faction ====
 
An NPC can belong to a faction, and that faction can have dispositions toward other factions. Factions are defined in <code>game/shared/shareddefs.h</code> (by default there are none).
 
; <code>AddFactionRelationship()</code>
: Adds a faction relationship for this NPC only.
; <code>CBaseCombatCharacter::SetDefaultFactionRelationship()</code>
: Adds a static faction relationship which is shared by all NPCs.
; <code>ChangeFaction()</code>
: Sets the faction to which the NPC belongs.
 
==== Class ====
 
An NPC can classify itself. This particular class is the return value of the <code>Classify()</code> function, and is ''not'' related to C++ or Hammer classes.
 
; <code>AddClassRelationship()</code>
: Adds a class relationship for this NPC only.
; <code>CBaseCombatCharacter::SetDefaultRelationship()</code>
: Adds a static class relationship which is shared by all NPCs.
; <code>Class_T Classify()</code>
: Returns this NPC's class.
 
Too add a new NPC class,go to basentity.h, line 95 and add you class.
 
==== Entity ====
 
Lastly, one-off relationships can be specified between any two NPCs.
 
; <code>AddEntityRelationship()</code>
: Adds a relationship between this NPC and another.
 
{{navbar|:Category:AI Programming|Creating an NPC|Giving an NPC Memory}}


[[Category:AI Programming]]
[[Category:AI Programming]]

Latest revision as of 11:31, 18 March 2024

English (en)中文 (zh)Translate (Translate)

This page covers creating a simple NPC using the SDK's template.

Setting up

All versions of the SDK (including Alien Swarm) provide a NPC template file at server/hl2/monster_dummy.cpp. You can copy this file to a new location and start working on it.

Change the model path in Precache() and Spawn() to a valid model file (choose something humanoid for now) and you will be able to spawn a NPC which turns to face sounds it hears nearby.

Relationships

This section targets the Alien Swarm Alien Swarm codebase.

An NPC's relationships define how it reacts to other NPCs. Use each NPC's FindEntityRelationship(CBaseEntity *pTarget) function to test the relationship state.

Dispositions

There are four built-in "dispositions":

  • D_HATE
  • D_FEAR
  • D_LIKE
  • D_NEUTRAL

Each relationship has a priority. The relationship with the highest priority wins if there is a conflict.

Targets

A relationship can target one of three things:

Faction

An NPC can belong to a faction, and that faction can have dispositions toward other factions. Factions are defined in game/shared/shareddefs.h (by default there are none).

AddFactionRelationship()
Adds a faction relationship for this NPC only.
CBaseCombatCharacter::SetDefaultFactionRelationship()
Adds a static faction relationship which is shared by all NPCs.
ChangeFaction()
Sets the faction to which the NPC belongs.

Class

An NPC can classify itself. This particular class is the return value of the Classify() function, and is not related to C++ or Hammer classes.

AddClassRelationship()
Adds a class relationship for this NPC only.
CBaseCombatCharacter::SetDefaultRelationship()
Adds a static class relationship which is shared by all NPCs.
Class_T Classify()
Returns this NPC's class.

Too add a new NPC class,go to basentity.h, line 95 and add you class.

Entity

Lastly, one-off relationships can be specified between any two NPCs.

AddEntityRelationship()
Adds a relationship between this NPC and another.

← [[::Category:AI Programming|:Category:AI Programming]]