亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲欧洲另类国产综合| 久久亚洲影视婷婷| 欧美一区二区播放| 懂色一区二区三区免费观看| 亚洲精品ww久久久久久p站| 日韩中文字幕1| 99视频精品在线| 久久综合网色—综合色88| 亚洲伊人伊色伊影伊综合网| 懂色av噜噜一区二区三区av| 91精品国产入口| 亚洲国产日韩精品| fc2成人免费人成在线观看播放 | 日韩vs国产vs欧美| av电影天堂一区二区在线观看| 日韩三级免费观看| 亚洲国产成人精品视频| av在线不卡电影| 国产欧美一区二区精品性色| 青青草视频一区| 欧美日韩一区不卡| 亚洲激情成人在线| 色综合天天综合网国产成人综合天| 国产成人亚洲综合色影视| 欧美v日韩v国产v| 日韩不卡在线观看日韩不卡视频| 欧美日韩激情一区二区三区| 一区二区三区蜜桃网| 97精品国产露脸对白| 国产精品网曝门| 粉嫩蜜臀av国产精品网站| 亚洲精品一区二区精华| 美女视频黄a大片欧美| 8v天堂国产在线一区二区| 丝袜诱惑制服诱惑色一区在线观看| 亚洲一区二区三区四区在线观看| 99精品久久免费看蜜臀剧情介绍| 欧美经典一区二区| 成人一区在线观看| 亚洲欧洲韩国日本视频| 91色九色蝌蚪| 亚洲 欧美综合在线网络| 7777精品伊人久久久大香线蕉完整版| 亚洲国产日韩a在线播放性色| 欧美日韩精品综合在线| 亚洲成人av免费| 欧美三级欧美一级| 精品乱人伦小说| 国产成人在线免费观看| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲高清中文字幕| 欧美性生活久久| 免费不卡在线视频| 久久综合九色综合欧美亚洲| 韩国一区二区三区| 欧美经典一区二区三区| 日本道在线观看一区二区| 天使萌一区二区三区免费观看| 国产精品一区二区三区乱码| 国产精品久久久久久久裸模 | 亚洲欧美激情小说另类| 91豆麻精品91久久久久久| 亚洲欧美乱综合| 色乱码一区二区三区88| 日本不卡高清视频| 国产欧美日韩精品在线| 欧洲亚洲国产日韩| 精品一区二区三区视频 | 一区二区视频在线看| 欧美日韩一区三区| 丝袜美腿亚洲一区二区图片| 久久一区二区视频| 欧美午夜精品久久久| 七七婷婷婷婷精品国产| 亚洲欧洲av一区二区三区久久| 欧美日韩一区成人| 国产成人午夜99999| 一区二区三区在线观看欧美| 日韩欧美色综合| 一本大道av伊人久久综合| 久久99蜜桃精品| 欧美日韩视频专区在线播放| 国模套图日韩精品一区二区| 亚洲精品国久久99热| 久久久久综合网| 欧美午夜影院一区| 成人免费视频免费观看| 日av在线不卡| 亚洲美女免费在线| 亚洲国产成人在线| 日韩一区二区三区电影在线观看| 91日韩精品一区| 国产精品一区2区| 视频一区欧美精品| 亚洲欧美日韩国产另类专区| 成人免费高清在线| 久久99国产精品麻豆| 亚洲午夜免费视频| 亚洲欧美激情小说另类| 国产精品日产欧美久久久久| 久久亚洲精华国产精华液 | 精品粉嫩超白一线天av| 欧美日韩成人激情| 欧美性生活大片视频| 色哦色哦哦色天天综合| 成人精品在线视频观看| 国产在线精品免费| 精品一区二区精品| 久久机这里只有精品| 日本在线不卡一区| 视频一区视频二区在线观看| 亚洲一二三区不卡| 亚洲图片欧美综合| 伊人色综合久久天天| 亚洲婷婷国产精品电影人久久| 精品久久人人做人人爽| 日韩一区二区三区av| 欧美一区二区三区成人| 欧美一卡二卡在线| 精品少妇一区二区三区日产乱码 | 在线观看亚洲精品视频| 色综合天天在线| 色综合久久综合网欧美综合网| 成人免费视频一区| 色女孩综合影院| 欧美午夜精品一区二区三区| 欧美日韩国产区一| 在线91免费看| 精品成人免费观看| 国产欧美精品区一区二区三区| 国产精品天干天干在观线| 中文字幕一区在线| 亚洲视频网在线直播| 夜色激情一区二区| 日韩二区在线观看| 国产综合色视频| 成人免费高清视频| 色婷婷av久久久久久久| 欧美日韩国产123区| 精品日韩一区二区三区免费视频| 成人app网站| 欧美视频一区二区| 日韩三级中文字幕| 国产亚洲精品福利| 亚洲欧美日韩国产手机在线| 偷窥少妇高潮呻吟av久久免费| 欧美精品一区二区不卡| 欧美激情一区二区在线| 亚洲免费观看高清| 日本午夜精品视频在线观看| 国产老肥熟一区二区三区| 99久久99久久免费精品蜜臀| 欧美日韩国产综合一区二区 | 美女网站色91| 成人丝袜高跟foot| 欧美日韩高清一区二区不卡 | 国产精品久久久一区麻豆最新章节| 亚洲激情欧美激情| 国产精品1区二区.| 欧美三级在线看| 国产日韩欧美在线一区| 亚洲成国产人片在线观看| 国产不卡一区视频| 制服丝袜亚洲播放| 亚洲少妇30p| 国产综合色视频| 精品视频123区在线观看| 2020国产精品自拍| 亚洲国产毛片aaaaa无费看 | 精品99一区二区三区| 国产精品免费aⅴ片在线观看| 免费观看30秒视频久久| 91亚洲资源网| 国产欧美日韩视频在线观看| 麻豆精品一二三| 欧美色综合天天久久综合精品| 国产日本亚洲高清| 久久精品99国产精品| 欧美日韩aaaaaa| 一区二区三区在线播放| eeuss鲁一区二区三区| 日韩欧美美女一区二区三区| 亚洲va在线va天堂| 91在线观看美女| 国产精品久久久久久久岛一牛影视| 日本不卡一区二区三区| 91黄色免费版| 亚洲另类在线一区| www.欧美.com| 中文乱码免费一区二区| 极品尤物av久久免费看| 欧美一二三区在线观看| 奇米精品一区二区三区在线观看一 | 国产精品乱码一区二区三区软件| 奇米777欧美一区二区| 欧美精品乱码久久久久久按摩| 综合欧美一区二区三区| 成人激情午夜影院| 国产精品区一区二区三区| 国产成人在线电影|