//----------------------------------------------------------------------------- // 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 ); }
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()); }
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); } }
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 ); */ }