//-----------------------------------------------------------------------------
// Purpose: 
// Input  : id - 
//			priority - 
//			player - 
//			entity - 
//-----------------------------------------------------------------------------
C_TFBaseHint::C_TFBaseHint( int id, int priority, int entity, HINTCOMPLETIONFUNCTION pfn /*=NULL*/ )
	: vgui::Panel( NULL, "TFBaseHint" ), m_CursorNone( vgui::dc_none )
{
	m_pObject = NULL;
	m_pClearLabel = NULL;
	m_pCaption = NULL;
	m_pfnCompletion = pfn;

	// Child of main panel
	SetParent( VGui_GetClientDLLRootPanel() );
	
	// Put at top of z-order (happens in Think, too)
//	MoveToFront();

	// No cursor
	SetCursor( m_CursorNone );
	// Set to default size
	SetSize( TFBASEHINT_DEFAULT_WIDTH, TFBASEHINT_DEFAULT_HEIGHT );
	// We'll expressly delete it
	SetAutoDelete( false );

	// Set up default values
	SetID( id );
	SetPriority( priority );
	SetEntity( entity );
	SetCompleted( false );
	// Target panel
	m_hTarget		= NULL; 
	
	m_bMoving		= false;
	m_flMoveRemaining	= 0.0f;
	m_flMoveTotal		= 0.0f;

	for ( int pt = 0; pt < 2; pt++ )
	{
		m_nMoveStart[ pt ] = 0;
		m_nMoveEnd[ pt ] = 0;
	}

	vgui::ivgui()->AddTickSignal( GetVPanel() );

	// Create clear label
	m_pClearLabel = new vgui::Label( this, "CLEAR", "[Enter] to remove, [Enter] twice quickly to remove all..." );
	m_pClearLabel->SetContentAlignment( vgui::Label::a_west );
	m_pClearLabel->SetTextInset( 3, 2 );

	// Create window caption
	m_pCaption = new vgui::Label( this, "CAPTION", "" );
	m_pCaption->SetContentAlignment( vgui::Label::a_west );
	m_pCaption->SetTextInset( 3, 0 );

	// See if the hint started out complete!
	CheckForCompletion();

	// Always start out hidden
	SetVisible( false );
}
Example #2
0
 BOOL CompleteBusRequest(SD_API_STATUS SdStatus) {
     // Note the response should be updaed by SDHC.
     Status  = SdStatus;
     m_fCompleted = TRUE;
     return (m_pParentBus!=NULL? m_pParentBus->CheckForCompletion():CheckForCompletion());
 }
Example #3
0
void NetChannel::ProcessIncoming(unsigned char *data, int size)
{
	BitBuffer message(data, size);

	int i;
	unsigned int sequence, sequence_ack;
	unsigned int reliable_ack, reliable_message;
	unsigned int fragid[MAX_STREAMS] = { 0, 0 };

	bool frag_message[MAX_STREAMS] = { false, false };
	int frag_offset[MAX_STREAMS] = { 0, 0 };
	int frag_length[MAX_STREAMS] = { 0, 0 };

	bool message_contains_fragments;
	int net_drop;
	float newLoss;
	float weight;

	// get sequence numbers
	sequence = message.ReadLong();
	if (sequence == CONNECTIONLESS_HEADER)
	{
		NetPacket *p = new NetPacket;

		p->connectionless = true;
		p->time = m_System->GetTime();
		p->seqnr = -1;

		p->address.FromNetAddress(&m_remote_address);
		p->data.Resize(size - 4);
		p->data.WriteBuf(data + 4, size - 4);
		p->data.Reset();

		m_incomingPackets.AddHead(p);
		return;
	}

	if (!m_connected) {
		return;
	}

	sequence_ack = message.ReadLong();

	COM_UnMunge2(message.GetData() + 8, size - 8, sequence & 0xFF);

	reliable_message = sequence >> 31;
	reliable_ack = sequence_ack >> 31;
	message_contains_fragments = sequence & (1 << 30) ? true : false;

	// TODO: Looks like need to move it above COM_UnMunge2
	if (sequence_ack & 0x40000000)
	{
		m_crashed = true;
		return;
	}

	if (message_contains_fragments)
	{
		for (i = 0; i < MAX_STREAMS; i++)
		{
			if (message.ReadByte())
			{
				frag_message[i] = true;
				fragid[i] = message.ReadLong();
				frag_offset[i] = message.ReadShort();
				frag_length[i] = message.ReadShort();
			}
		}
	}

	sequence &= ~(1 << 31);
	sequence &= ~(1 << 30);

	sequence_ack &= ~(1 << 31);
	sequence_ack &= ~(1 << 30);

	if (sequence <= (unsigned int)m_incoming_sequence)
	{
		if (sequence == (unsigned int)m_incoming_sequence)
			m_System->DPrintf("NetChannel::ProcessIncoming: duplicate packet %i at %i from %s\n", sequence, m_incoming_sequence, m_remote_address.ToString());
		else
			m_System->DPrintf("NetChannel::ProcessIncoming: out of order packet %i at %i from %s\n", sequence, m_incoming_sequence, m_remote_address.ToString());

		return;
	}

	// dropped packets don't keep the message from being used
	net_drop = sequence - (m_incoming_sequence + 1);
	if (net_drop < 0) {
		net_drop = 0;
	}

	newLoss = (net_drop + 1) * (1.0f / 200.0f);
	if (newLoss < 1.0f)
	{
		weight = (float)net_drop / (float)(net_drop + 1);
		m_loss = (1.0 - newLoss) * m_loss + weight * newLoss;
	}
	else
		m_loss = 1;

	// if the current outgoing reliable message has been acknowledged
	// clear the buffer to make way for the next
	if (reliable_ack == (unsigned int)m_reliable_sequence)
	{
		if (m_incoming_acknowledged + 1 >= m_last_reliable_sequence)
		{
			// it has been received
			m_reliableOutSize = 0;
		}
	}

	// if this message contains a reliable message, bump incoming_reliable_sequence
	m_incoming_sequence = sequence;
	m_incoming_acknowledged = sequence_ack;
	m_incoming_reliable_acknowledged = reliable_ack;

	if (reliable_message) {
		m_incoming_reliable_sequence ^= 1u;
	}

	int statId = m_flow[FLOW_INCOMING].current & 0x1f;
	m_flow[FLOW_INCOMING].stats[statId].size = size + UDP_HEADER_SIZE;
	m_flow[FLOW_INCOMING].stats[statId].time = m_System->GetTime();
	m_flow[FLOW_INCOMING].current++;

	m_last_received = m_System->GetTime();

	if (message_contains_fragments)
	{
		for (i = 0; i <= 1; ++i)
		{
			int j;
			fragbuf_t *pbuf;
			int inbufferid;
			int intotalbuffers;

			if (!frag_message[i])
				continue;

			inbufferid = FRAG_GETID(fragid[i]);
			intotalbuffers = FRAG_GETCOUNT(fragid[i]);

			if (fragid[i])
			{
				pbuf = FindBufferById(&m_incomingbufs[i], fragid[i], true);
				if (pbuf)
				{
					memcpy(pbuf->data, message.GetData() + message.CurrentSize() + frag_offset[i], frag_length[i]);
					pbuf->size = frag_length[i];
				}
				else
				{
					m_System->Printf("NetChannel::ProcessIncoming: couldn't allocate or find buffer %i\n", inbufferid);
				}

				// Count # of incoming bufs we've queued? are we done?
				CheckForCompletion(i, intotalbuffers);
			}

			// Rearrange incoming data to not have the frag stuff in the middle of it
			int wpos = message.CurrentSize() + frag_offset[i];
			int rpos = wpos + frag_length[i];

			memmove(message.GetData() + wpos, message.GetData() + rpos, message.GetMaxSize() - rpos);
			message.m_MaxSize -= frag_length[i];

			for (j = i + 1; j < MAX_STREAMS; j++)
			{
				// fragments order already validated
				frag_offset[j] -= frag_length[i];
			}
		}
	}

	int curLen = message.GetMaxSize() - message.CurrentSize();
	if (curLen > 0)
	{
		NetPacket *p = new NetPacket;
		p->connectionless = 0;
		p->hasReliableData = reliable_message != 0;
		p->time = m_System->GetTime();
		p->seqnr = m_incoming_sequence;
		p->address.FromNetAddress(&m_remote_address);
		p->data.Resize(curLen);
		p->data.WriteBuf(message.m_CurByte, curLen);
		p->data.Reset();
		m_incomingPackets.AddHead(p);
	}
}
Example #4
0
void ResourceStream::Update() {
	CheckForCompletion();
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void C_TFBaseHint::OnTick()
{
	if ( !IsVisible() )
		return;

//	MoveToFront();

	// Check for completion of entire hint
	CheckForCompletion();

	int numactive = 0;
	bool setactive = false;
	// Remove obsolete items
	int i;
	for ( i = m_Hints.Size() - 1; i >= 0; i-- )
	{
		ITFHintItem *item = m_Hints[ i ];
		if ( !item )
			continue;

		if ( item->GetCompleted() )
		{
			RemoveHintItem( i );
		}
		else
		{
			numactive++;
		}
	}

	// Mark first one as active
	// Perform think
	for ( i = 0; i < m_Hints.Size(); i++ )
	{
		ITFHintItem *item = m_Hints[ i ];
		if ( !item )
			continue;

		if ( !setactive )
		{
			item->SetActive( true );
			setactive = true;
		}
		else
		{
			item->SetActive( false );
		}

		// Think, too
		if ( item->GetActive() )
		{
			item->Think();
		}
	}

	// No more active items
	if ( !numactive )
		SetCompleted( true );

	// Keep moving window to correct position
	AnimatePosition();

/*
	static float nextchange = 0.0f;

	if ( gpGlobals->curtime < nextchange )
		return;

	nextchange = gpGlobals->curtime + 1.0f;

	int w, h;
	GetSize( w, h );

	int x = random->RandomInt( 0, ScreenWidth() - w );
	int y = random->RandomInt( 0, ScreenHeight() - h );

	SetDesiredPosition( x, y, 0.9f );
*/
}