📄 ai.htm
字号:
if (move > 0)
{
if (move > self.yaw_speed)
move = self.yaw_speed;
}
else
{
if (move < 0-self.yaw_speed )
move = 0-self.yaw_speed;
}
current_yaw = anglemod (current_yaw + move);
self.angles_y = current_yaw;
};
*/</i>
<i>//============================================================================</i>
<a href="qc-types.htm#void">void</a>() <b>HuntTarget</b><a name="HuntTarget">=</a>
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_goalentity">goalentity</a> = <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>;
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_think">think</a> = <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_th_run">th_run</a>;
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> = <a href="qc-built.htm#vectoyaw">vectoyaw</a>(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_origin">origin</a> - <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_origin">origin</a>);
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_nextthink">nextthink</a> = <a href="qc-glob.htm#time">time</a> + 0.1;
<a href="subs.htm#SUB_AttackFinished">SUB_AttackFinished</a> (1); <i>// wait a while before first attack</i>
};
<a href="qc-types.htm#void">void</a>() <b>SightSound</b><a name="SightSound">=</a>
{
<b>local</b> <a href="qc-types.htm#float">float</a> rsnd;
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_ogre"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"ogre/ogwake.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_knight"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"knight/ksight.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_shambler"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"shambler/ssight.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_demon1"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"demon/sight2.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_wizard"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"wizard/wsight.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_zombie"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"zombie/z_idle.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_dog"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"dog/dsight.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_hell_knight"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"hknight/sight1.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_tarbaby"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"blob/sight1.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_vomit"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"vomitus/v_sight1.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_enforcer"</b>)
{
rsnd = <a href="qc-built.htm#rint">rint</a>(<a href="qc-built.htm#random">random</a>() * 3);
<b>if</b> (rsnd == 1)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"enforcer/sight1.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (rsnd == 2)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"enforcer/sight2.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (rsnd == 0)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"enforcer/sight3.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b>
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"enforcer/sight4.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
}
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_army"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"soldier/sight1.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
<b>else</b> <b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_shalrath"</b>)
<a href="qc-built.htm#sound">sound</a> (<a href="qc-glob.htm#self">self</a>, <a href="qc-defs.htm#CHAN_VOICE">CHAN_VOICE</a>, <b>"shalrath/sight.wav"</b>, 1, <a href="qc-defs.htm#ATTN_NORM">ATTN_NORM</a>);
};
<a href="qc-types.htm#void">void</a>() <b>FoundTarget</b><a name="FoundTarget">=</a>
{
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"player"</b>)
{ <i>// let other monsters see this monster for a while</i>
<a href="ai.htm#sight_entity">sight_entity</a> = <a href="qc-glob.htm#self">self</a>;
<a href="ai.htm#sight_entity_time">sight_entity_time</a> = <a href="qc-glob.htm#time">time</a>;
}
<a href="qc-glob.htm#self">self</a>.show_hostile = <a href="qc-glob.htm#time">time</a> + 1; <i>// wake up other monsters</i>
<a href="ai.htm#SightSound">SightSound</a> ();
<a href="ai.htm#HuntTarget">HuntTarget</a> ();
};
<i>/*
===========
FindTarget
Self is currently not attacking anything, so try to find a target
Returns TRUE if an enemy was sighted
When a player fires a missile, the point of impact becomes a fakeplayer so
that monsters that see the impact will respond as if they had seen the
player.
To avoid spending too much time, only a single client (or fakeclient) is
checked each frame. This means multi player games will have slightly
slower noticing monsters.
============
*/</i>
<a href="qc-types.htm#float">float</a>() <b>FindTarget</b><a name="FindTarget">=</a>
{
<b>local</b> <a href="qc-types.htm#entity">entity</a> client;
<b>local</b> <a href="qc-types.htm#float">float</a> r;
<i>// if the first spawnflag bit is set, the monster will only wake up on</i>
<i>// really seeing the player, not another monster getting angry</i>
<i>// spawnflags & 3 is a big hack, because zombie crucified used the first</i>
<i>// spawn flag prior to the ambush flag, and I forgot about it, so the second</i>
<i>// spawn flag works as well</i>
<b>if</b> (<a href="ai.htm#sight_entity_time">sight_entity_time</a> >= <a href="qc-glob.htm#time">time</a> - 0.1 && !(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_spawnflags">spawnflags</a> & 3) )
{
client = <a href="ai.htm#sight_entity">sight_entity</a>;
<b>if</b> (client.<a href="qc-enty.htm#dot_enemy">enemy</a> == <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>)
<b>return</b>;
}
<b>else</b>
{
client = <a href="qc-built.htm#checkclient">checkclient</a> ();
<b>if</b> (!client)
return FALSE; <i>// current check entity isn't in PVS</i>
}
<b>if</b> (client == <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>)
return FALSE;
<b>if</b> (client.<a href="qc-enty.htm#dot_flags">flags</a> & <a href="defs.htm#FL_NOTARGET">FL_NOTARGET</a>)
return FALSE;
<b>if</b> (client.<a href="qc-enty.htm#dot_items">items</a> & <a href="qc-defs.htm#IT_INVISIBILITY">IT_INVISIBILITY</a>)
return FALSE;
r = <a href="ai.htm#range">range</a> (client);
<b>if</b> (r == <a href="defs.htm#RANGE_FAR">RANGE_FAR</a>)
return FALSE;
<b>if</b> (!<a href="ai.htm#visible">visible</a> (client))
return FALSE;
<b>if</b> (r == <a href="defs.htm#RANGE_NEAR">RANGE_NEAR</a>)
{
<b>if</b> (client.show_hostile < <a href="qc-glob.htm#time">time</a> && !<a href="ai.htm#infront">infront</a> (client))
return FALSE;
}
<b>else</b> <b>if</b> (r == <a href="defs.htm#RANGE_MID">RANGE_MID</a>)
{
<b>if</b> ( <i>/* client.show_hostile < time || */</i>
!<a href="ai.htm#infront">infront</a> (client))
return FALSE;
}
<i>//</i>
<i>// got one</i>
<i>//</i>
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a> = client;
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_classname">classname</a> != <b>"player"</b>)
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a> = <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>;
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_classname">classname</a> != <b>"player"</b>)
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a> = <a href="qc-glob.htm#world">world</a>;
return FALSE;
}
}
<a href="ai.htm#FoundTarget">FoundTarget</a> ();
return TRUE;
};
<i>//=============================================================================</i>
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#float">float</a> dist) <b>ai_forward</b><a name="ai_forward">=</a>
{
<a href="qc-built.htm#walkmove">walkmove</a> (<a href="qc-glob.htm#self">self</a>.angles_y, dist);
};
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#float">float</a> dist) <b>ai_back</b><a name="ai_back">=</a>
{
<a href="qc-built.htm#walkmove">walkmove</a> ( (<a href="qc-glob.htm#self">self</a>.angles_y+180), dist);
};
<i>/*
=============
ai_pain
stagger back a bit
=============
*/</i>
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#float">float</a> dist) <b>ai_pain</b><a name="ai_pain">=</a>
{
<a href="ai.htm#ai_back">ai_back</a> (dist);
/*
<b>local</b> <a href="qc-types.htm#float">float</a> away;
away = <a href="qc-built.htm#anglemod">anglemod</a> (<a href="qc-built.htm#vectoyaw">vectoyaw</a> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_origin">origin</a> - <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_origin">origin</a>)
+ 180*(<a href="qc-built.htm#random">random</a>()- 0.5) );
<a href="qc-built.htm#walkmove">walkmove</a> (away, dist);
*/
};
<i>/*
=============
ai_painforward
stagger back a bit
=============
*/</i>
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#float">float</a> dist) <b>ai_painforward</b><a name="ai_painforward">=</a>
{
<a href="qc-built.htm#walkmove">walkmove</a> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a>, dist);
};
<i>/*
=============
ai_walk
The monster is walking it's beat
=============
*/</i>
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#float">float</a> dist) <b>ai_walk</b><a name="ai_walk">=</a>
{
<b>local</b> <a href="qc-types.htm#vector">vector</a> mtemp;
<a href="defs.htm#movedist">movedist</a> = dist;
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_dragon"</b>)
{
<a href="qc-built.htm#movetogoal">movetogoal</a> (dist);
<b>return</b>;
}
<i>// check for noticing a player</i>
<b>if</b> (<a href="ai.htm#FindTarget">FindTarget</a> ())
<b>return</b>;
<a href="qc-built.htm#movetogoal">movetogoal</a> (dist);
};
<i>/*
=============
ai_stand
The monster is staying in one place for a while, with slight angle turns
=============
*/</i>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -