亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? actor.cpp

?? this keik game source
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	vision_distance = G_GetFloatArg( "visiondistance", 1024 );

   eyeoffset = "0 0 0";
	eyeposition = "0 0 64";

	hasalert = false;

	lastEnemy = NULL;
	enemyRange = RANGE_FAR;
	seenEnemy = false;
   nodeathfade = false;
   nochatter = false;

	turnspeed = 60;

   if ( !parentmode->value )
      {
      flags |= FL_BLOOD;
      flags |= FL_DIE_GIBS;
      }

   //
   // don't talk all at once initially
   //
	chattime = G_Random( 20 );
	nextsoundtime = 0;
   trig = NULL;
   deathgib = false;

	// set default crouchsize
	crouchsize_min = "-16 -16 0";
	crouchsize_max = "16 16 32";
	standsize_min = mins;
	standsize_max = maxs;

	// use a cvar to help with debugging
	ai_actorscript = gi.cvar( "ai_actorscript", "", 0 );
	actorscript = G_GetStringArg( "script", "global/enemy.scr" );
	actorstart = G_GetStringArg( "thread", "" );
	kill_thread = G_GetStringArg( "killthread", "" );

   // default melee characteristics
   melee_range = 100;
   melee_damage = 30;
   // default aim (normal)
   aim = G_GetFloatArg( "aim", 0 );
   // default pain_threshold is 10
   pain_threshold = G_GetFloatArg( "painthreshold", 10 * skill->value );
   // default shots per attack is 5 + ( 2 * skill->level )
   shots_per_attack = G_GetFloatArg( "shotsperattack", 3 + ( 2 * skill->value ) );

	startpos = worldorigin;

	next_drown_time = 0;
	air_finished = level.time + 5;
   last_jump_time = 0;

   CheckWater();

   setSize( "-16 -16 0", "16 16 76" );
   //setModel( G_GetSpawnArg( "model", "grunt.def" ) );
	showModel();

   if ( !LoadingSavegame )
      {
      // save off our spawn args
      args.SetArgs();
      G_InitSpawnArguments();

	   // force the init commands to be processed so that we start the right actor script immediately
	   CancelEventsOfType( EV_ProcessInitCommands );
	   ev = new Event( EV_ProcessInitCommands );
	   ev->AddInteger( edict->s.modelindex );
	   ProcessEvent( ev );

      SetupThread();

      if ( eyeposition.z > maxs.z )
         {
         eyeposition.z = maxs.z;
         }

      // restore our args
      G_InitSpawnArguments();
      args.RestoreArgs();
   
      // wait until the script starts before thinking
	   PostEvent( EV_Actor_Start, FRAMETIME );
      }

   //
   // I put this here, so that the initcommands would already be processed
   //
   skinname = G_GetSpawnArg( "skin" );
   if ( skinname && skinname[ 0 ] )
      {
      int skinnum;

      skinnum = gi.Skin_NumForName( edict->s.modelindex, skinname );
      if (skinnum >= 0)
         edict->s.skinnum = skinnum;
      }

	}

Actor::~Actor()
	{
	int n;
	int i;

	if ( actorthread )
		{
		actorthread->ProcessEvent( EV_ScriptThread_End );
		actorthread = NULL;
		}

	// delete the old action/response list
	n = actionList.NumObjects();
	for( i = n; i >= 1; i-- )
		{
		delete actionList.ObjectAt( i );
		}
	actionList.ClearObjectList();
	if ( behavior )
		{
		delete behavior;
		behavior = NULL;
		}

	if ( path )
		{
		delete path;
		path = NULL;
		}

   if ( trig )
      {
      delete trig;
      trig = NULL;
      }

	ClearStateStack();
	}

void Actor::Start
	(
	Event *ev 
	)

	{
	MonsterStart *start;
	
	// This is only used for choosing delay times for targeting enemies
	static int actornum = 0;

	hasalert = ( gi.Anim_Random( edict->s.modelindex, "alert" ) != -1 );

	start = MonsterStart::GetRandomSpot( spawngroup );
	if ( start )
		{
		setOrigin( start->worldorigin );
		worldorigin.copyTo( edict->s.old_origin );
		setAngles( start->worldangles );
		if ( start->animname != "" )
			{
			SetAnim( start->animname );
			}
		}

	droptofloor( 16 );

	flags |= FL_PRETHINK;

   // see if we have any melee attacks
   if ( HasAnim( "melee" ) )
      {
      has_melee = true;
      }
   else
      {
      // 
      // make sure we can't knock the weapon out of this characters hands
      //
      if ( currentWeapon )
         {
         Event * ev;

         ev = new Event( EV_Weapon_NotDroppable );
         currentWeapon->ProcessEvent( ev );
         }
      has_melee = false;
      }

	// spread their targeting about a bit
	PostEvent( EV_Actor_TargetEnemies, ( actornum++ % 10 ) * FRAMETIME );
	}

//***********************************************************************************************
//
// Vision functions
//
//***********************************************************************************************

range_t Actor::Range
	(
	Entity *targ
	)

   {
   float r;
   Vector delta;

   delta = centroid - targ->centroid;
	r = delta * delta;
	if ( r < 120 * 120 )
		{
		return RANGE_MELEE;
		}

	if ( r < 500 * 500 )
		{
		return RANGE_NEAR;
		}

	if ( r < 1000 * 1000 )
		{
		return RANGE_MID;
		}

	return RANGE_FAR;
   }

inline qboolean Actor::InFOV
	(
	Vector pos
	)

	{
	Vector delta;
	float	 dot;

	delta = pos - EyePosition();
   if ( !delta.x && !delta.y )
      {
      // special case for straight up and down
      return true;
      }

	// give better vertical vision
	delta.z = 0;

	delta.normalize();
	dot = DotProduct( orientation[ 0 ], delta.vec3() );

	return ( dot > fovdot );
	}

inline qboolean Actor::InFOV
	(
	Entity *ent
	)

	{
	return InFOV( ent->centroid );
	}

inline qboolean Actor::CanSeeFOV
	(
	Entity *ent
	)

	{
	return InFOV( ent ) && CanSeeFrom( worldorigin, ent );
	}

inline qboolean Actor::CanSeeFrom
  	(
	Vector pos,
	Entity *ent
	)

	{
	trace_t trace;
	Vector p;

	p = ent->centroid;

	// Check if he's visible
	trace = G_Trace( pos + eyeposition, vec_zero, vec_zero, p, this, MASK_OPAQUE, "Actor::CanSeeFrom 1" );
	if ( trace.fraction == 1.0 || trace.ent == ent->edict )
		{
		return true;
		}

	// Check if his head is visible
	p.z = ent->absmax.z;
	trace = G_Trace( pos + eyeposition, vec_zero, vec_zero, p, this, MASK_OPAQUE, "Actor::CanSeeFrom 2" );
	if ( trace.fraction == 1.0 || trace.ent == ent->edict )
		{
		return true;
		}

	return false;
	}

qboolean Actor::CanSee
	(
	Entity *ent
	)

	{
	return CanSeeFrom( worldorigin, ent );
	}

int Actor::EnemyCanSeeMeFrom
	(
	Vector pos
	)

	{
	Entity	*ent;
	int		i;
	int		n;
	float		rad;
	Vector	d;
	Vector	p1;
	Vector	p2;
	int		c;

	rad = max( size.x, size.y ) * 1.44 * 0.5;

	c = 0;
	n = enemyList.NumObjects();
	for( i = 1; i <= n; i++ )
		{
		ent = enemyList.ObjectAt( i );
		if ( !ent || ent->deadflag || ( ent->flags & FL_NOTARGET ) )
			{
			continue;
			}

		if ( WithinDistance( ent, vision_distance ) )
			{
			// To check if we're visible, I create a plane that intersects the actor
			// and is perpendicular to the delta vector between the actor and his enemy.
			// I place four points on this plane that "frame" the actor and check if 
			// the enemy can see any of those points.
			d = ent->centroid - pos;
			d.z = 0;
			d.normalize();
			p1.x = -d.y;
			p1.y = d.x;
			p1 *= rad;
			p2 = p1;
			p1.z = mins.z;
			p2.z = maxs.z;

			if ( CanSeeFrom( pos + p1, ent ) )
				{
				c++;
				}
			if ( CanSeeFrom( pos + p2, ent ) )
				{
				c++;
				}
			p1.z = -p1.z;
			p2.z = -p2.z;
			if ( CanSeeFrom( pos - p1, ent ) )
				{
				c++;
				}
			if ( CanSeeFrom( pos - p2, ent ) )
				{
				c++;
				}
			}
		}

	return c;
	}

qboolean Actor::CanSeeEnemyFrom
	(
	Vector pos
	)

	{
	Entity	*ent;
	int		i;
	int		n;

	n = enemyList.NumObjects();
	for( i = 1; i <= n; i++ )
		{
		ent = enemyList.ObjectAt( i );
		if ( !ent || ent->deadflag || ( ent->flags & FL_NOTARGET ) )
			{
			continue;
			}

		if ( WithinDistance( ent, vision_distance ) && CanSeeFrom( pos, ent ) )
			{
			return true;
			}
		}

	return false;
	}

//***********************************************************************************************
//
// Weapon functions
//
//***********************************************************************************************

qboolean Actor::WeaponReady
	(
	void
	)
	
	{
   if ( currentWeapon && currentWeapon->ReadyToFire() )
      {
      return true;
      }
   else if ( !currentWeapon && has_melee )
      {
      return true;
      }

	return false;
	}

void Actor::Attack
	(
	Event *ev
	)

	{
	Vector delta;
	Vector ang;
	Vector ang2;

	if ( ( currentWeapon ) && currentWeapon->ReadyToFire() && currentWeapon->HasAmmo() )
		{
		if ( currentEnemy )
			{
			ang = angles;
			delta = currentEnemy->centroid - GunPosition();
			ang2 = delta.toAngles();
			ang2[ 0 ] = -ang2[ 0 ];
			setAngles( ang2 );
			currentWeapon->Fire();
			setAngles( ang );
			}
		else
			{
			currentWeapon->Fire();
			}
		}
	}

Vector Actor::GunPosition
	(
	void
	)

	{
   vec3_t	trans[ 3 ];
   vec3_t   orient;
   int		groupindex;
   int		tri_num;
	Vector	offset = vec_zero;
	Vector	result;

	// get the gun position of the actor
	if ( !gi.GetBoneInfo( edict->s.modelindex, "gun", &groupindex, &tri_num, orient ) )
		{
		// Gun doesn't have a barrel, just return the default
		return worldorigin + gunoffset;
		}

	gi.GetBoneTransform( edict->s.modelindex, groupindex, tri_num, orient, edict->s.anim,
		edict->s.frame, edict->s.scale, trans, offset.vec3() );

	MatrixTransformVector( offset.vec3(), orientation, result.vec3() );
	result += worldorigin;

	return result;
	}

inline Vector Actor::MyGunAngles
	(
   Vector muzzlepos, 
   qboolean firing
	)
	
	{
	Vector ang;
	Vector dir;


	if ( currentEnemy && firing )
		{
		dir = currentEnemy->centroid - muzzlepos;
		dir.z += ( currentEnemy->absmax.z - currentEnemy->centroid.z ) * 0.75f;
		dir.normalize();

      ang = dir.toAngles();
      ang.x = -ang.x;
      }
   else
      {
	   ang.x = -worldangles.x;
	   ang.y = worldangles.y;
	   ang.z = worldangles.z;
      }

	return ang;
	}


#define MIN_AIM_DISTANCE 400
inline void Actor::GetGunOrientation
	(
   Vector muzzlepos,
	Vector *forward,
	Vector *right,
	Vector *up
	)
	
   {
   Vector ang;
   float  accuracy;
   float	 spread;
   float  invaim;
   float  skl;
   float  enemydistance;

   ang = MyGunAngles( muzzlepos, true );

   if ( currentEnemy )
      {
	   enemydistance = ( currentEnemy->centroid - muzzlepos ).length();
      if ( enemydistance < MIN_AIM_DISTANCE )
         enemydistance = MIN_AIM_DISTANCE;
      }
   else

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧亚一区二区三区| 午夜精品一区二区三区免费视频| 一区二区三区免费观看| 亚洲国产aⅴ成人精品无吗| 亚洲另类中文字| 视频一区欧美精品| eeuss国产一区二区三区| 欧美在线免费播放| 91老师国产黑色丝袜在线| 欧美电影在哪看比较好| 国产精品美女www爽爽爽| 欧美激情综合五月色丁香 | 欧美精品一区二区三区视频| 91精品国产一区二区三区| 中文字幕亚洲区| 蜜桃一区二区三区四区| 欧美亚洲自拍偷拍| 久久久国际精品| 亚洲福利视频一区二区| 91国产免费看| 亚洲一二三四久久| 久久99久久精品| 一本色道久久加勒比精品| 久久一二三国产| 成人性生交大片免费看中文网站| 欧美日韩国产影片| 国产欧美一区二区精品久导航 | 国产成人高清在线| 中文字幕亚洲精品在线观看 | 欧美性欧美巨大黑白大战| 欧美激情中文不卡| 国产一区二区在线观看视频| av在线不卡免费看| 精品动漫一区二区三区在线观看| 免费国产亚洲视频| 亚洲欧美日韩中文字幕一区二区三区 | 一区二区三区自拍| 欧美一区午夜精品| 亚洲国产va精品久久久不卡综合| 精品久久久久久久久久久久久久久 | 岛国一区二区三区| 538在线一区二区精品国产| 爽爽淫人综合网网站| 精品国产伦理网| 精品福利一二区| 在线亚洲免费视频| 91丨国产丨九色丨pron| 日韩一区二区三免费高清| 日本不卡一区二区三区| 在线观看日韩av先锋影音电影院| 国产成人亚洲综合a∨猫咪| 一区二区三区精品| 91麻豆精品国产91久久久更新时间| 91精品国产色综合久久ai换脸| 日韩高清不卡在线| 亚洲一区二区三区四区中文字幕| 久久一区二区三区四区| 7777女厕盗摄久久久| 不卡av免费在线观看| 亚洲成a人片综合在线| 中文字幕欧美日本乱码一线二线| 色婷婷久久久久swag精品| 色天天综合久久久久综合片| 午夜国产不卡在线观看视频| 国产精品欧美久久久久一区二区| 欧美日韩在线三区| 欧美日韩在线一区二区| 一本到一区二区三区| 在线观看91精品国产入口| 成人福利在线看| 亚洲福中文字幕伊人影院| 日韩欧美中文一区| 亚洲制服丝袜一区| 亚洲日本在线天堂| 26uuuu精品一区二区| 91高清视频在线| 成人av在线资源网| 暴力调教一区二区三区| 国产91在线看| 国产精品一级黄| 在线视频观看一区| 1区2区3区欧美| 欧美精品123区| 国产亚洲成aⅴ人片在线观看| 亚洲国产成人午夜在线一区 | 免费久久精品视频| 精品一区二区三区香蕉蜜桃 | 99久久精品免费观看| 欧美日韩国产一级二级| 99vv1com这只有精品| 欧美在线不卡一区| 日韩精品最新网址| 国产精品网站一区| 美女www一区二区| 97精品国产97久久久久久久久久久久| 激情另类小说区图片区视频区| 日本网站在线观看一区二区三区 | 欧美日韩日日摸| 久久综合久久综合久久| 亚洲国产人成综合网站| 五月婷婷另类国产| 美国欧美日韩国产在线播放| 国产又黄又大久久| 88在线观看91蜜桃国自产| 久久久久久9999| 亚洲不卡一区二区三区| 欧美日韩黄色影视| 精品黑人一区二区三区久久| 亚洲国产成人tv| 国产精品一区二区黑丝| 国产精品进线69影院| 日韩精品欧美成人高清一区二区| 欧美综合欧美视频| 午夜成人免费电影| 欧洲亚洲国产日韩| 国产精品综合视频| 久久久久青草大香线综合精品| 亚洲成av人片在线观看无码| 99re热视频这里只精品 | 久久久精品国产免大香伊| 黄网站免费久久| 欧美大片在线观看| 欧美精品一区二区三区蜜桃| 国产一区 二区 三区一级| 欧美顶级少妇做爰| 日韩成人一区二区三区在线观看| 亚洲国产美女搞黄色| 欧美日韩小视频| 麻豆91精品91久久久的内涵| 国产精品毛片无遮挡高清| 欧美吻胸吃奶大尺度电影| 蜜桃久久久久久| 久久精品人人做人人爽人人| 99精品欧美一区| 亚洲国产精品av| 欧美无砖专区一中文字| 2023国产精品视频| 丰满白嫩尤物一区二区| 国产精品久久久久久久久免费丝袜| 91麻豆国产福利在线观看| 亚洲精品国产品国语在线app| 欧美色图在线观看| 麻豆91在线观看| 国产欧美日韩久久| 国产欧美精品一区二区三区四区| 欧美怡红院视频| 国产精品久久久久一区二区三区| 日韩一区二区精品| 欧美在线不卡一区| 国产激情视频一区二区在线观看 | 欧美一区二区私人影院日本| 国产凹凸在线观看一区二区 | 日韩一区二区三区在线观看| 99re6这里只有精品视频在线观看| 自拍偷自拍亚洲精品播放| 欧美一区二区福利在线| 成人福利在线看| 国产精品18久久久久久久久久久久 | 91免费在线播放| jizzjizzjizz欧美| 日韩中文字幕不卡| 一区二区欧美精品| 日本欧美大码aⅴ在线播放| 久久久久久久久99精品| 国产精品丝袜91| 国产欧美中文在线| 国产视频一区在线播放| 2024国产精品| 亚洲码国产岛国毛片在线| 亚洲国产精品成人久久综合一区| 欧美电视剧免费全集观看| 久久亚洲一级片| 国产免费久久精品| 2021国产精品久久精品| 久久一区二区三区四区| 国产精品沙发午睡系列990531| 欧美激情一区二区三区在线| 欧美国产精品专区| 日韩精品一级中文字幕精品视频免费观看| 精品在线观看视频| 色婷婷综合在线| 欧美午夜精品久久久久久孕妇 | 亚洲国产毛片aaaaa无费看| 国产凹凸在线观看一区二区| 91免费观看视频在线| 久久伊人中文字幕| 性久久久久久久久久久久| 狠狠色丁香婷综合久久| 色狠狠色噜噜噜综合网| 欧美偷拍一区二区| 国产精品久久久久影院色老大| 18欧美亚洲精品| 日本vs亚洲vs韩国一区三区二区 | 国产一区91精品张津瑜| 色婷婷精品大视频在线蜜桃视频| 欧美美女一区二区三区| 国产欧美日韩另类一区| 久久er99精品| 激情图区综合网| 欧美久久久久久久久|