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

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

?? trigger.cpp

?? this keik game source
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/*****************************************************************************/

CLASS_DECLARATION( Entity, Trigger, "trigger_multiple" );

ResponseDef Trigger::Responses[] =
	{
	   { &EV_Trigger_SetWait,				( Response )Trigger::EventSetWait },
	   { &EV_Trigger_SetDelay,				( Response )Trigger::EventSetDelay },
	   { &EV_Trigger_SetCount,				( Response )Trigger::EventSetCount },
	   { &EV_Trigger_SetMessage,			( Response )Trigger::EventSetMessage },
	   { &EV_Trigger_SetNoise,				( Response )Trigger::EventSetNoise },
	   { &EV_Touch,							( Response )Trigger::TriggerStuff },
	   { &EV_Killed,							( Response )Trigger::TriggerStuff },
	   { &EV_Activate,						( Response )Trigger::TriggerStuff },
	   { &EV_Trigger_ActivateTargets,	( Response )Trigger::ActivateTargets },
	   { &EV_Trigger_SetKey,				( Response )Trigger::EventSetKey },
	   { &EV_Trigger_StartThread,			( Response )Trigger::StartThread },
		{ NULL, NULL }
	};

Trigger::Trigger()
	{
	triggerActivated	= false;
	activator			= NULL;
	trigger_time		= (float)0;

	setMoveType( MOVETYPE_NONE );
	setSolidType( SOLID_TRIGGER );

	delay = G_GetFloatArg( "delay" );
	wait  = G_GetFloatArg( "wait", 0.2 );
	health = G_GetFloatArg( "health", 0 );
	max_health = health;
	if ( health )
		{
		takedamage = DAMAGE_YES;
		setSolidType( SOLID_BBOX );
		}

	trigger_time = (float)0;

	count = G_GetFloatArg( "cnt", -1 );

	SetNoise( G_GetSpawnArg( "noise", "environment/switch/switch2.wav" ) );
	SetMessage( G_GetSpawnArg( "message" ) );
	SetKillTarget( G_GetSpawnArg( "killtarget" ) );

	hideModel();

	respondto = spawnflags ^ TRIGGER_PLAYERS;

	key = G_GetStringArg( "key" );
   thread = G_GetStringArg( "thread" );

   //
   // gross HACK for non-standard secret triggers
   //
   if ( message == "secret" )
      {
      TriggerSecret *trig;

      // don't ever trigger
      trigger_time = -1;

      // clear out the message
      G_SetSpawnArg( "message", "" );

      // spawn the replacement trigger
      trig = new TriggerSecret;

      // delete ourself on the way out.
      PostEvent( EV_Remove, 0 );
      }
	}

Trigger::~Trigger()
	{
	}

void Trigger::StartThread
	(
	Event *ev
	)

	{
   if ( thread.length() )
      {
      if ( !ExecuteThread( thread ) )
         {
         warning( "StartThread", "Null game script" );
         }
      }
   }

void Trigger::TriggerStuff
	(
	Event *ev
	)

	{
	Entity *other;
	Event *event;
	qboolean respond;

   // Don't bother with testing anything if we can't trigger yet
   if ( ( level.time < trigger_time ) || ( trigger_time == -1 ) )
		{
		return;
		}
	
	health = max_health;
	if ( health && ( ( int )*ev != ( int )EV_Killed ) && ( ( int )*ev != ( int )EV_Activate ) )
		{
		// if health is set, we only respond to killed and activate messages
		return;
		}

	other = ev->GetEntity( 1 );

	assert( other != this );

	respond = ( ( ( respondto & TRIGGER_PLAYERS ) && other->isClient() ) ||
		( ( respondto & TRIGGER_MONSTERS ) && other->isSubclassOf( Actor ) ) ||
		( ( respondto & TRIGGER_PROJECTILES ) && other->isSubclassOf( Projectile ) ) );

	// Always respond to activate messages from the world since they're probably from 
	// the "trigger" command
	if ( !respond && !( ( other == world ) && ( ( int )*ev == ( int )EV_Activate ) ) )
		{
		return;
		}

   if ( key.length() )
      {
      if ( !other->isSubclassOf( Sentient ) || !( ( (Sentient *)other )->HasItem( key.c_str() ) ) ) 
         {
         Item        *item;
         ClassDef		*cls;  
         str         dialog;

         cls = getClass( key.c_str() );
		   if ( !cls )
			   {
			   gi.dprintf( "No item named '%s'\n", key.c_str() );
			   return;
			   }
		   item = ( Item * )cls->newInstance();
         item->CancelEventsOfType( EV_Item_DropToFloor );
	      item->CancelEventsOfType( EV_Remove );
         item->ProcessPendingEvents();
         dialog = item->GetDialogNeeded();
         if ( dialog.length() > 1 )
            {
            if ( !ExecuteThread( dialog ) )
               {
               warning( "TriggerStuff", "Null game script" );
               }
            }
         else
            {
            gi.centerprintf ( other->edict, "jcx yv 20 string \"You need this item:\" jcx yv -20 icon %d", item->GetIconIndex() );
            }
         delete item;
         return;
         }
      }

	trigger_time = level.time + wait;

	event = new Event( EV_Trigger_Effect );
	event->AddEntity( other );
	PostEvent( event, delay );

	event = new Event( EV_Trigger_ActivateTargets );
	event->AddEntity( other );
	PostEvent( event, delay );

   if ( thread.length() )
      {
      // don't trigger the thread if we were triggered by the world touching us
      if ( ( other != world ) || ( ev->GetSource() != EV_FROM_CODE ) )
         {
	      event = new Event( EV_Trigger_StartThread );
   	   PostEvent( event, delay );
         }
      }

	if ( count > -1 )
		{
		count--;
		if ( count < 1 )
			{
			//
			// Don't allow it to trigger anymore
			//
			trigger_time = -1;

			//
			// Make sure we wait until we're done triggering things before removing
			//
			PostEvent( EV_Remove, delay + 0.1 );
			}
		}
	}

//
//==============================
// ActivateTargets
//
// "other" should be set to the entity that initiated the firing.
//
// Centerprints any message to the activator.
//
// Removes all entities with a targetname that match killtarget,
// so some events can remove other triggers.
//
// Search in targetname of all entities that match target 
// and send EVENT_ACTIVATE to there event handler
//==============================
//
void Trigger::ActivateTargets
	(
	Event *ev
	)

	{
	Entity	*other;
	Entity	*ent;
	Event		*event;
	const char *name;
	int		num;

	other = ev->GetEntity( 1 );

   if ( !other )
      other = world;

	if ( triggerActivated )
		{
		//
		// Entity triggered itself.  Prevent an infinite loop
		//
		ev->Error( "Entity targeting itself--Targetname '%s'", TargetName() );
		return;
		}

	triggerActivated = true;
	activator = other;
	
//
// print the message
//
	if ( message.length() && other && other->isClient() )
		{
		gi.centerprintf( other->edict, "jcx jcy string \"%s\"", message.c_str() );
		if ( Noise().length() )
			{
			other->sound( noise, 1, CHAN_VOICE, ATTN_NORM );
			}
		}
		
//
// kill the killtargets
//
	name = KillTarget();
	if ( name && strcmp( name, "" ) )
		{
		num = 0;
		do
			{
			num = G_FindTarget( num, name );
			if ( !num )
				{
				break;
				}

			ent = G_GetEntity( num );
			ent->PostEvent( EV_Remove, 0 );
			} 
		while ( 1 );
		}
		
//
// fire targets
//
	name = Target();
	if ( name && strcmp( name, "" ) )
		{
		num = 0;
		do
			{
			num = G_FindTarget( num, name );
			if ( !num )
				{
				break;
				}

			ent = G_GetEntity( num );
		
			event = new Event( EV_Activate );
			event->AddEntity( other );
			ent->ProcessEvent( event );
			}
		while ( 1 );
		}

	triggerActivated = false;
	}
	
void Trigger::EventSetWait
	(
	Event *ev
	)

	{
	wait = ev->GetFloat( 1 );
   }

void Trigger::EventSetDelay
	(
	Event *ev
	)

	{
	delay = ev->GetFloat( 1 );
	}

void Trigger::EventSetKey
	(
	Event *ev
	)

	{
	key = ev->GetString( 1 );
	}

void Trigger::EventSetCount
	(
	Event *ev
	)

	{
	count = ev->GetInteger( 1 );
   }

void Trigger::EventSetMessage
	(
	Event *ev
	)

	{
  	SetMessage( ev->GetString( 1 ) );
	}

void Trigger::SetMessage
	( 
	const char *text
	)

	{
   if ( text )
      message = str( text );
	}

str &Trigger::Message
	(
	void
	)

	{
   return message;
	}

void Trigger::EventSetNoise
	(
	Event *ev
	)
	
	{
   SetNoise( ev->GetString( 1 ) );
	}

void Trigger::SetNoise
	( 
	const char *text
	)

	{
   if ( text )
      {
      noise = str( text );
      //
      // cache in the sound
      //
      gi.soundindex( text );
      }
	}

str &Trigger::Noise
	(
	void
	)

	{
	return noise;
	}

CLASS_DECLARATION( Trigger, TouchField, NULL );

ResponseDef TouchField::Responses[] =
	{
	   { &EV_Trigger_Effect,				( Response )TouchField::SendEvent },
		{ NULL, NULL }
	};

void TouchField::Setup
	(
	Entity *ownerentity,
	Event touchevent,
	Vector min,
	Vector max,
	int respondto
	)

	{
	assert( ownerentity );
	if ( !ownerentity )
		{
		error( "Setup", "Null owner" );
		}

	owner = ownerentity;
	ontouch	= touchevent;
	setSize( min, max );

   setSolidType( SOLID_TRIGGER );

	this->respondto = respondto;
	}

void TouchField::SendEvent
	(
	Event *ev
	)

	{
	Event *event;

   // Check if our owner is still around
   if ( owner )
      {
	   event = new Event( ontouch );
	   event->AddEntity( ev->GetEntity( 1 ) );
	   owner->PostEvent( event, delay );
      }
   else
      {
      // Our owner is gone!  The bastard didn't delete us!
      // Guess we're no longer needed, so remove ourself.
      PostEvent( EV_Remove, 0 );
      }
	}

/*****************************************************************************/
/*SINED trigger_once (.5 .5 .5) ? notouch x NOT_PLAYERS MONSTERS PROJECTILES

Variable sized trigger. Triggers once, then removes itself.  
You must set the key "target" to the name of another object in the 
level that has a matching 

If "health" is set, the trigger must be killed to activate it.
If "delay" is set, the trigger waits some time after activating before firing.

"targetname".  If "health" is set, the trigger must be killed to activate.

"thread" name of thread to trigger.  This can be in a different script file as well\
by using the '::' notation.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产真实精品久久二三区| 久久亚洲精品小早川怜子| 亚洲香肠在线观看| 日韩欧美国产综合| 99国产精品视频免费观看| 亚洲国产一区视频| 国产美女久久久久| 国产一区二区在线免费观看| 日本高清无吗v一区| 91蜜桃免费观看视频| 一本久久a久久精品亚洲| a级精品国产片在线观看| 丁香六月综合激情| 福利一区二区在线观看| 国产电影一区二区三区| www.日韩在线| 久久人人爽爽爽人久久久| 精品国产乱码久久久久久久久| 欧美xxxx在线观看| 久久99久久精品| 免费在线看成人av| 美女被吸乳得到大胸91| 精品亚洲免费视频| 欧美日韩国产天堂| 日韩欧美国产综合一区| 亚洲成人av一区二区| 日本va欧美va瓶| 欧美日韩亚州综合| 欧美一卡二卡三卡四卡| 欧美一级午夜免费电影| 亚洲午夜三级在线| 日本韩国一区二区三区| 成人免费一区二区三区视频 | 国产高清无密码一区二区三区| 欧美日韩国产中文| 亚洲精品成人悠悠色影视| 亚洲一区二区在线观看视频| 日本人妖一区二区| 国产成人鲁色资源国产91色综 | 国产精品你懂的| 一区二区三区四区五区视频在线观看| 日本欧美久久久久免费播放网| 欧美日韩免费视频| 日本成人中文字幕在线视频| 欧美成人vps| 国产成人午夜电影网| 中文字幕在线一区| 美女视频黄频大全不卡视频在线播放| 久久不见久久见中文字幕免费| 国产精品18久久久久| 91福利国产成人精品照片| 一区二区三区高清在线| 欧美日韩国产精选| 国产一区二区三区四区五区入口| 久久先锋资源网| av亚洲精华国产精华精| 亚洲精品视频免费看| 欧美福利电影网| 亚洲欧美视频一区| 懂色av一区二区在线播放| 亚洲欧美欧美一区二区三区| 欧美性感一区二区三区| 亚洲男人电影天堂| 欧美在线小视频| 国产精品久久久久婷婷| 欧美日韩国产美| 国产精品一线二线三线| 悠悠色在线精品| 欧美一激情一区二区三区| 午夜精品免费在线观看| 91网站在线播放| 日韩黄色片在线观看| 欧美主播一区二区三区美女| 日韩精品一卡二卡三卡四卡无卡| 国产亚洲精品aa| 国产在线播放一区二区三区| 国产精品成人一区二区艾草 | 日韩欧美色电影| 成人午夜电影久久影院| 性欧美疯狂xxxxbbbb| 欧美日韩大陆在线| 久久精品噜噜噜成人av农村| 国产精品久久久久久久久免费丝袜 | 国产成人啪午夜精品网站男同| 亚洲精品高清在线| 精品久久人人做人人爽| 欧洲日韩一区二区三区| 东方欧美亚洲色图在线| 蜜桃av噜噜一区| 一区二区成人在线| 日本一区二区在线不卡| 国产最新精品精品你懂的| 依依成人综合视频| 国产精品对白交换视频| 国产婷婷色一区二区三区| 欧美日韩视频不卡| 欧美在线免费播放| va亚洲va日韩不卡在线观看| 国产一区二区在线电影| 麻豆视频观看网址久久| 午夜久久久久久| 亚洲成人黄色影院| 亚洲午夜免费福利视频| 亚洲综合偷拍欧美一区色| 亚洲欧洲国产专区| 久久久久久久免费视频了| 日韩美女视频在线| 欧美电影一区二区| 欧美日韩在线亚洲一区蜜芽| 91视频一区二区| 97精品国产露脸对白| 亚洲精品一区二区三区香蕉| 欧美色成人综合| 色综合天天在线| 久久先锋影音av| 91精品国产免费| 欧美区一区二区三区| 在线观看一区不卡| 91国内精品野花午夜精品| 99re这里都是精品| 91丨九色丨国产丨porny| eeuss鲁一区二区三区| 国产99久久久久久免费看农村| 日本成人在线一区| 99久久婷婷国产综合精品| 国产高清亚洲一区| 国产精品一区二区你懂的| 久久99精品视频| 狠狠色丁香婷综合久久| 九九视频精品免费| 国产伦精一区二区三区| caoporn国产精品| 色婷婷香蕉在线一区二区| 欧美在线播放高清精品| 7777精品伊人久久久大香线蕉超级流畅 | 久久久蜜桃精品| 国产精品久久久久久久久晋中| 一二三四社区欧美黄| 91香蕉视频在线| 欧美精品123区| 久久精品无码一区二区三区| 国产精品理论在线观看| 日韩精品一区二区三区在线| 捆绑变态av一区二区三区| 麻豆精品一二三| 国产91色综合久久免费分享| 成人亚洲一区二区一| 91小视频免费观看| 欧美一级爆毛片| 亚洲视频资源在线| 日韩免费视频一区| 精品国产成人在线影院 | 亚洲一线二线三线久久久| 视频一区中文字幕| 国产91丝袜在线观看| 91国产免费看| 欧美精品一区二区不卡| 亚洲三级免费电影| 麻豆精品在线观看| 色欧美片视频在线观看在线视频| 日韩一区二区在线观看视频播放| 国产视频一区二区三区在线观看| 亚洲一区二区三区自拍| 国产精品一区二区男女羞羞无遮挡 | 中文久久乱码一区二区| 午夜精品免费在线观看| a在线播放不卡| 亚洲精品在线观看视频| 一区二区三区在线观看欧美| 国产高清久久久| 欧美一区二区精品| 一区二区三区四区高清精品免费观看| 国内精品国产成人国产三级粉色| 欧美三级一区二区| 国产精品沙发午睡系列990531| 日韩精品一级中文字幕精品视频免费观看 | 一区二区三区国产精华| 激情六月婷婷综合| 欧美网站大全在线观看| 中文字幕一区在线观看| 黄页网站大全一区二区| 51久久夜色精品国产麻豆| 亚洲桃色在线一区| 成人免费精品视频| 久久免费美女视频| 精品一区二区影视| 欧美精品v国产精品v日韩精品| 亚洲男同性恋视频| 91论坛在线播放| 亚洲人成在线播放网站岛国| 成人夜色视频网站在线观看| 国产人成一区二区三区影院| 国产精品一区二区在线看| 日韩视频123| 免费成人性网站| 欧美一区二区三区爱爱| 日本欧美在线观看| 日韩一二在线观看| 美女任你摸久久| 在线电影欧美成精品|