void WaitNPCRespond ( gentity_t *self )
{
	//make sure the responding ent is still valid
	if ( !self->enemy || !self->enemy->client || !self->enemy->NPC )
	{
		G_FreeEntity( self );
		return;
	}

	if ( gi.S_Override[0] )
	{//player is still talking
		self->nextthink = level.time + 500;
		//set enemy to not respond for a bit longer
		self->enemy->NPC->blockedSpeechDebounceTime = level.time + 1000;
		return;
	}

	if ( self->enemy->health <= 0 || (!self->alt_fire && (self->enemy->NPC->scriptFlags&SCF_NO_RESPONSE)) )
	{
		G_FreeEntity( self );
		return;
	}

	//set enemy to be ready to respond
	self->enemy->NPC->blockedSpeechDebounceTime = 0;

	if ( self->alt_fire )
	{//Run the NPC's usescript
		G_ActivateBehavior( self->enemy, BSET_USE );
	}
	else
	{//make them respond generically
		NPC_Respond( self->enemy, 0 );
	}
}
void NPC_UseResponse( gentity_t *self, gentity_t *user, qboolean useWhenDone )
{
	qboolean	noGreet = qfalse;

	if ( !self->NPC || !self->client )
	{
		return;
	}

	if ( user->s.number != 0 )
	{//not used by the player
		if ( useWhenDone )
		{
			G_ActivateBehavior( self, BSET_USE );
		}
		return;
	}

	if ( user->client && self->client->playerTeam != user->client->playerTeam )
	{//only those on the same team react
		if ( useWhenDone )
		{
			G_ActivateBehavior( self, BSET_USE );
		}
		return;
	}

	if ( self->NPC->blockedSpeechDebounceTime > level.time )
	{//I'm not responding right now
		return;
	}

	if ( gi.S_Override[self->s.number] )
	{//I'm talking already
		if ( !useWhenDone )
		{//you're not trying to use me
			return;
		}
		else
		{//I'm talking, so don't greet me
			noGreet = qtrue;
		}
	}

	if ( !noGreet && user->s.number == 0 && G_PlayerGreet( self, useWhenDone ) )
	{
		return;
	}

	if ( useWhenDone )
	{
		G_ActivateBehavior( self, BSET_USE );
	}
	else
	{
		NPC_Respond( self, user->s.number );
	}
}
Пример #3
0
void NPC_UseResponse( gentity_t *self, gentity_t *user, qboolean useWhenDone )
{
	if ( !self->NPC || !self->client )
	{
		return;
	}

	//OJKFIXME: clientnum 0
	if ( user->s.number != 0 )
	{//not used by the player
		if ( useWhenDone )
		{
			G_ActivateBehavior( self, BSET_USE );
		}
		return;
	}

	if ( user->client && self->client->playerTeam != user->client->playerTeam && self->client->playerTeam != NPCTEAM_NEUTRAL )
	{//only those on the same team react
		if ( useWhenDone )
		{
			G_ActivateBehavior( self, BSET_USE );
		}
		return;
	}

	if ( self->NPC->blockedSpeechDebounceTime > level.time )
	{//I'm not responding right now
		return;
	}

	/*
	if ( gi.VoiceVolume[self->s.number] )
	{//I'm talking already
		if ( !useWhenDone )
		{//you're not trying to use me
			return;
		}
	}
	*/
	//rwwFIXMEFIXME: Support for this?

	if ( useWhenDone )
	{
		G_ActivateBehavior( self, BSET_USE );
	}
	else
	{
		NPC_Respond( self, user->s.number );
	}
}