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

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

?? thrall.cpp

?? this keik game source
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/thrall.cpp                       $
// $Revision:: 12                                                             $
//   $Author:: Aldie                                                          $
//     $Date:: 11/09/98 12:58a                                                $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/thrall.cpp                            $
// 
// 12    11/09/98 12:58a Aldie
// Parentmode for death sequence
// 
// 11    11/08/98 8:30p Aldie
// Added gibfest for thrall
// 
// 10    10/27/98 10:17p Jimdose
// better aiming by walls
// more damage from pulse
// precached models
// 
// 9     10/27/98 5:22p Jimdose
// tweaked him
// 
// 8     10/27/98 5:55a Jimdose
// added Chatter
// 
// 7     10/27/98 4:55a Jimdose
// NULLed out EV_FadeOut response so that Thrall sticks around
// 
// 6     10/27/98 3:52a Jimdose
// got pulse weapon working
// 
// 5     10/26/98 2:50p Aldie
// Fixed a bug with checking of NULL owners
// 
// 4     10/24/98 3:33a Jimdose
// changed refrences to origin to worldorigin
// 
// 3     10/24/98 12:51a Aldie
// Fixed init bug
// 
// 2     10/23/98 5:37a Jimdose
// Created file
// 
// 1     10/22/98 10:19p Jimdose
// 
// DESCRIPTION:
// ThrallMaster
// 

#include "g_local.h"
#include "actor.h"
#include "thrall.h"
#include "explosion.h"
#include "vehicle.h"
#include "object.h"
#include "gibs.h"

#define DRUNKMISSILE_SPEED 1000.0f

Event EV_ThrallMaster_FirePulse( "firepulse" );
Event EV_ThrallMaster_FireRockets( "firerockets" );
Event EV_ThrallMaster_GibFest( "gibfest" );

CLASS_DECLARATION( Actor, ThrallMaster, "boss_thrallmaster" );

ResponseDef ThrallMaster::Responses[] =
	{
      { &EV_ThrallMaster_FirePulse,     ( Response )ThrallMaster::FirePulse },
      { &EV_ThrallMaster_FireRockets,   ( Response )ThrallMaster::FireRockets },
      { &EV_Sentient_WeaponUse,         ( Response )ThrallMaster::WeaponUse },
      { &EV_ThrallMaster_GibFest,       ( Response )ThrallMaster::GibFest },
      { &EV_FadeOut,                    NULL },
		{ NULL, NULL }
	};

ThrallMaster::ThrallMaster()
	{
   modelIndex( "sprites/thrallpulse.spr" );
   modelIndex( "view_genbullet.def" );
   modelIndex( "trocket.def" );
   modelIndex( "thrallfire.def" );

   setModel( "thrall.def" );
   weaponmode = PRIMARY;
   gunbone = "gun";
   flags |= FL_NOION;
	}

Vector ThrallMaster::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, gunbone.c_str(), &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;
	}

qboolean ThrallMaster::CanShootFrom
	(
	Vector pos,
	Entity *ent,
	qboolean usecurrentangles
	)

	{
   int      mask;
	Vector	delta;
	Vector	start;
	Vector	end;
	float		len;
	trace_t	trace;
	Vehicle	*v;
	Entity	*t;
   Vector   ang;

	if ( !currentWeapon || !WithinDistance( ent, vision_distance ) )
		{
      if (!currentWeapon && !has_melee )
		   return false;
		}

	if ( usecurrentangles )
		{
   	Vector	dir;

      start = pos + GunPosition() - worldorigin;
		end = ent->centroid;
		end.z += ( ent->absmax.z - ent->centroid.z ) * 0.75f;
		delta = end - start;
      ang = delta.toAngles();
      ang.x = -ang.x;
      ang.y = angles.y;
		len = delta.length();
   	ang.AngleVectors( &dir, NULL, NULL );
      dir *= len;
      end = start + dir;
		}
	else
		{
      vec3_t	trans[ 3 ];
      vec3_t	transtemp[ 3 ];
      vec3_t   orient;
      int		groupindex;
      int		tri_num;
	   Vector	offset = vec_zero;
	   Vector	result;

      // endpos
		end = ent->centroid;
		end.z += ( ent->absmax.z - ent->centroid.z ) * 0.75f;

      // get the gun position of the actor
   	if ( !gi.GetBoneInfo( edict->s.modelindex, gunbone.c_str(), &groupindex, &tri_num, orient ) )
		   {
		   // Gun doesn't have a barrel, just return the default
		   result = gunoffset;
		   }
      else
         {
         Vector forward, right, up;

         // get new forward vec
         forward = end - worldorigin;
         forward.z = 0;
         forward.normalize();
         forward.copyTo( trans[ 0 ] );

         // new right vec
         right.x = -forward.y;
         right.y = forward.x;
         right.z = 0;
         right.copyTo( trans[ 1 ] );

         // new up vec
         up.x = 0;
         up.y = 0;
         up.z = 1;
         up.copyTo( trans[ 2 ] );

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

	      MatrixTransformVector( offset.vec3(), trans, result.vec3() );
         }

      start = pos + result;
      delta = end - start;
      len = delta.length();
		}

	// check if we're too far away, or too close
   if ( currentWeapon )
      {
	   if ( ( len > attack_range ) || ( len > currentWeapon->GetMaxRange() ) || ( len < currentWeapon->GetMinRange() ) )
		   {
		   return false;
		   }
      mask = MASK_SHOT;
      }
   else
      {
	   if ( ( len > attack_range ) || ( len > melee_range ) )
		   {
		   return false;
		   }
      mask = MASK_PROJECTILE;
      }

	// shoot past the guy we're shooting at
	end += delta * 4;

	// Check if he's visible
	trace = G_Trace( start, vec_zero, vec_zero, end, this, mask, "Actor::CanShootFrom" );
	if ( trace.startsolid )
		{
		return false;
		}

	// If we hit the guy we wanted, then shoot
	if ( trace.ent == ent->edict )
		{
		return true;
		}

	// if we hit a vehicle, check if the driver is someone we want to hit
	t = trace.ent->entity;
	if ( t && t->isSubclassOf( Vehicle ) )
		{
		v = ( Vehicle * )t;
		if ( ( v->Driver() == ent ) || IsEnemy( v->Driver() ) )
			{
			return true;
			}
		return false;
		}

	// If we hit someone else we don't like, then shoot
	if ( IsEnemy( t ) )
		{
		return true;
		}

	// if we hit something breakable, check if shooting it will
   // let us shoot someone.
	if ( t->isSubclassOf( Shatter ) || 
		t->isSubclassOf( Object ) ||
		t->isSubclassOf( DamageThreshold ) ||
		t->isSubclassOf( ScriptModel ) )
		{
      trace = G_Trace( Vector( trace.endpos ), vec_zero, vec_zero, end, t, mask, "Actor::CanShootFrom 2" );
	   if ( trace.startsolid )
		   {
		   return false;
		   }

	   // If we hit the guy we wanted, then shoot
	   if ( trace.ent == ent->edict )
		   {
		   return true;
		   }

	   // If we hit someone else we don't like, then shoot
	   if ( IsEnemy( trace.ent->entity ) )
		   {
		   return true;
		   }

      // Forget it then
      return false;
		}

	return false;
	}

void ThrallMaster::Chatter
	(
	const char *snd,
	float chance,
	float volume,
	int channel
	)

	{
	if ( chattime > level.time )
		{
		return;
		}

   RandomSound( snd, volume, channel, ATTN_NONE );

	chattime = level.time + 7 + G_Random( 5 );
	}

void ThrallMaster::WeaponUse
   (
   Event *ev
   )

   {
   Sentient::WeaponUse( ev );
   if ( weaponmode == PRIMARY )
      {
      weaponmode = SECONDARY;
      gunbone = "chest";
      }
   else
      {
      weaponmode = PRIMARY;
      gunbone = "gun";
      }
   }

void ThrallMaster::GibFest
   (
   Event *ev
   )

   {
   Vector   pos;
   Gib      *gib1, *gib2;

   if ( sv_gibs->value && !parentmode->value )
      {
      GetBone( "chest", &pos, NULL, NULL, NULL );

      pos += worldorigin;

      gib1 = new Gib( "gib1.def" );
      gib1->setOrigin(pos);
      gib1->worldorigin.copyTo(gib1->edict->s.old_origin);
      gib1->SetVelocity( 1000 );
      gib1->velocity *= 3;
      gib1->edict->s.scale = 3.0;
      gib1->fadesplat = false;

      gib2 = new Gib( "gib2.def" );
      gib2->setOrigin(pos);
      gib2->worldorigin.copyTo(gib2->edict->s.old_origin);
      gib2->SetVelocity( 1000 );
      gib2->velocity *= 3;
      gib2->edict->s.scale = 3.0;
      gib2->fadesplat = false;
      }
   }

void ThrallMaster::FirePulse
	(
	Event *ev
	)

	{
	if ( ( currentWeapon ) && currentWeapon->ReadyToFire() && currentWeapon->HasAmmo() )
		{
      weaponmode = SECONDARY;
		currentWeapon->Fire();
		}
	}

void ThrallMaster::FireRockets
	(
	Event *ev
	)

	{
	if ( ( currentWeapon ) && currentWeapon->ReadyToFire() && currentWeapon->HasAmmo() )
		{
      weaponmode = PRIMARY;
		currentWeapon->Fire();
		}
   }

CLASS_DECLARATION( Weapon, ThrallGun, NULL );

ResponseDef ThrallGun::Responses[] =
	{
	   { &EV_Weapon_Shoot,        ( Response )ThrallGun::Shoot },
      { &EV_Weapon_SecondaryUse, ( Response )ThrallGun::SecondaryUse },
		{ NULL, NULL }
	};

ThrallGun::ThrallGun()
   {
   SetModels( NULL, "view_genbullet.def" );
	SetAmmo( "Rockets", 1, 10 );
   }

void ThrallGun::Shoot
	(
	Event *ev
	)

	{
	DrunkMissile *missile;
   ThrallPulse *pulse;
	Vector	pos;
	Vector	dir;

	assert( owner );
	if ( !owner )
		{
		return;
		}

   GetMuzzlePosition( &pos, &dir );

   if ( weaponmode == PRIMARY )
      {
	   missile = new DrunkMissile;
	   missile->Setup( owner, pos, dir );
      NextAttack( 0 );
      }
   else
      {
	   pulse = new ThrallPulse;
	   pulse->Setup( owner, pos, dir );
	   NextAttack( 0 );
      }
	}

void ThrallGun::SecondaryUse
   (
   Event *ev
   )

   {
   if ( weaponmode == PRIMARY )
      {
      weaponmode = SECONDARY;
      }
   else
      {
      weaponmode = PRIMARY;
      }
   }


Event EV_DrunkMissile_HeatSeek( "heatseek" );

CLASS_DECLARATION( Projectile, DrunkMissile, NULL );

ResponseDef DrunkMissile::Responses[] =
	{
      { &EV_Touch,                   ( Response )DrunkMissile::Explode },
      { &EV_DrunkMissile_HeatSeek,   ( Response )DrunkMissile::HeatSeek },
		{ NULL, NULL }
	};

EXPORT_FROM_DLL void DrunkMissile::Explode
	(
   Event *ev
	)

	{
	int damg;
	Vector v;
	Entity *other;
   Entity *owner;

   other = ev->GetEntity( 1 );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产wwwww| 99re热视频这里只精品| 日韩美女一区二区三区| 石原莉奈一区二区三区在线观看 | 国产精品一级片在线观看| 日韩精品一区国产麻豆| 国产成人午夜视频| 亚洲欧美激情一区二区| 精品1区2区3区| 免费在线视频一区| 亚洲精品伦理在线| 国产美女精品在线| 国产一区二区三区国产| 久久免费电影网| av在线综合网| 亚洲国产日产av| 精品对白一区国产伦| 国产.欧美.日韩| 亚洲影视在线观看| 欧美成人午夜电影| 97精品电影院| 美女网站一区二区| 国产精品剧情在线亚洲| 91福利在线看| 国产一区二区三区免费看| 国产精品国产馆在线真实露脸| 欧美日韩一级黄| 国产传媒久久文化传媒| 亚洲国产成人91porn| 久久久久久亚洲综合| 91福利在线播放| 国产一区二区三区在线观看免费视频| 国产精品国产三级国产普通话三级| 欧美日韩久久久一区| 欧美精品精品一区| 亚洲精品成人精品456| 日韩三级高清在线| 99视频精品免费视频| 免费人成在线不卡| 亚洲欧美在线另类| 精品国精品国产| 欧美日韩精品久久久| 懂色av一区二区三区免费观看 | 久久国产成人午夜av影院| 国产精品白丝在线| 久久九九99视频| 欧美一级日韩不卡播放免费| 91免费版在线看| 国产成人啪免费观看软件| 日本在线不卡视频| 一区二区在线观看av| 国产亚洲va综合人人澡精品| 日韩精品中午字幕| 91精品一区二区三区久久久久久| 色美美综合视频| 成av人片一区二区| 成人黄色国产精品网站大全在线免费观看| 青青草国产精品亚洲专区无| 亚洲一区二区三区不卡国产欧美| 亚洲欧美在线另类| 国产精品剧情在线亚洲| 欧美韩日一区二区三区| 精品久久久久香蕉网| 日韩欧美一级二级| 欧美一区三区四区| 91麻豆精品国产自产在线| 欧美三级资源在线| 欧美日韩综合在线免费观看| 欧美在线影院一区二区| 一本到不卡免费一区二区| 97久久精品人人做人人爽50路| 丰满少妇在线播放bd日韩电影| 国产精品一区三区| 国产盗摄女厕一区二区三区| 国产成a人亚洲精品| 国产91丝袜在线播放九色| 国产精品99久久久久久久vr | 欧美变态tickling挠脚心| 91精品黄色片免费大全| 日韩一区二区三| 日韩视频在线你懂得| 欧美变态凌虐bdsm| 国产亚洲va综合人人澡精品| 欧美极品aⅴ影院| 日韩一区在线播放| 亚洲欧美日韩国产一区二区三区| 亚洲精品国产高清久久伦理二区| 亚洲裸体xxx| 午夜精品福利一区二区三区av| 午夜视频一区二区三区| 奇米精品一区二区三区四区 | 91麻豆精品国产自产在线| 欧美一区二区在线视频| 欧美大片国产精品| 国产亚洲精品中文字幕| 亚洲人精品午夜| 日韩成人精品在线| 国产精品99久久久久久似苏梦涵 | 色综合中文字幕国产| 91蝌蚪porny| 在线观看91精品国产麻豆| 欧美精品一区二区三区一线天视频 | 日本一不卡视频| 久久99国产精品尤物| 盗摄精品av一区二区三区| 欧日韩精品视频| 欧美α欧美αv大片| 亚洲欧美自拍偷拍| 美腿丝袜一区二区三区| av不卡免费在线观看| 欧美疯狂做受xxxx富婆| 国产亚洲精品bt天堂精选| 亚洲一二三区不卡| 韩日av一区二区| 色老头久久综合| 精品国产sm最大网站| 亚洲另类在线一区| 九九国产精品视频| 91高清视频在线| 国产日韩精品一区二区三区在线| 亚洲综合视频网| 国产激情视频一区二区在线观看| 91久久精品一区二区二区| 欧美精品一区二区在线播放| 一区二区三区在线视频观看| 国产剧情在线观看一区二区| 欧美日韩免费观看一区三区| 中文字幕va一区二区三区| 日韩高清不卡一区二区| 99在线精品免费| 26uuu久久天堂性欧美| 亚洲一区二区综合| 成人黄色777网| 日韩欧美一区二区不卡| 一区二区三区国产豹纹内裤在线| 国产成人日日夜夜| 精品国产一二三区| 午夜精品久久久久影视| 91啪在线观看| 国产精品黄色在线观看| 国产成都精品91一区二区三 | 久久久91精品国产一区二区三区| 丝袜美腿亚洲色图| 欧美制服丝袜第一页| 亚洲色图色小说| 99久久久免费精品国产一区二区| 久久蜜桃一区二区| 99久久精品国产毛片| 欧美日韩一级片网站| 最新欧美精品一区二区三区| 精品在线一区二区三区| 这里是久久伊人| 亚洲aⅴ怡春院| 欧美日韩精品一区二区三区四区 | aaa欧美大片| 国产欧美日韩激情| 国产呦萝稀缺另类资源| 欧美xfplay| 极品少妇xxxx精品少妇偷拍| 欧美成人在线直播| 麻豆成人久久精品二区三区小说| 3d动漫精品啪啪一区二区竹菊 | 99麻豆久久久国产精品免费| 国产视频在线观看一区二区三区| 国产一区二区不卡| 久久精品人人做| 国产大片一区二区| 国产精品自在在线| 日韩免费一区二区三区在线播放| 日本中文字幕一区| 欧美一级片在线看| 国内精品久久久久影院色| 26uuu欧美| 成+人+亚洲+综合天堂| 亚洲卡通动漫在线| 欧美日韩国产一级| 久久国产精品免费| 国产亚洲va综合人人澡精品| 成人性生交大片| 亚洲精品免费看| 欧美精选一区二区| 九九视频精品免费| 中文字幕高清不卡| 色狠狠色狠狠综合| 喷白浆一区二区| 国产日韩亚洲欧美综合| 色综合天天综合狠狠| 午夜精品一区二区三区免费视频 | 久久女同性恋中文字幕| 丰满白嫩尤物一区二区| 亚洲精品视频在线观看免费| 欧美二区三区的天堂| 国产精品自拍三区| 一区二区高清免费观看影视大全| 欧美视频一区二区三区在线观看| 秋霞午夜鲁丝一区二区老狼| 中文字幕免费在线观看视频一区| 91理论电影在线观看| 久久狠狠亚洲综合| 亚洲欧洲韩国日本视频 |