⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ai.htm

📁 Quake 的 各 种 文 档 格 式 说 明
💻 HTM
📖 第 1 页 / 共 3 页
字号:
		
	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> &gt;= <a href="qc-glob.htm#time">time</a> - 0.1 &amp;&amp; !(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_spawnflags">spawnflags</a> &amp; 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> &amp; <a href="defs.htm#FL_NOTARGET">FL_NOTARGET</a>)
		return FALSE;
	<b>if</b> (client.<a href="qc-enty.htm#dot_items">items</a> &amp; <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 &lt; <a href="qc-glob.htm#time">time</a> &amp;&amp; !<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 + -