void CNametags::DrawFromAim() { unsigned long ulCurrentTime = CClientTime::GetTime(); // Got any players that are not local? if (m_pPlayerManager->Count() > 1) { // Grab the local player CClientPlayer* pLocalPlayer = m_pPlayerManager->GetLocalPlayer(); if (pLocalPlayer) { // Grab the current time and the camera unsigned long ulCurrentTime = CClientTime::GetTime(); CCamera* pCamera = g_pGame->GetCamera(); // Grab our controller state CControllerState State; g_pGame->GetPad()->GetCurrentControllerState(&State); // Grab our current weapon slot. Use screen center if melee or none CVector vecStart; CVector vecTarget; eWeaponSlot eSlot = pLocalPlayer->GetCurrentWeaponSlot(); if (eSlot == WEAPONSLOT_TYPE_UNARMED || eSlot == WEAPONSLOT_TYPE_MELEE || eSlot == WEAPONSLOT_TYPE_RIFLE || eSlot == WEAPONSLOT_TYPE_THROWN || eSlot == WEAPONSLOT_TYPE_SPECIAL || eSlot == WEAPONSLOT_TYPE_GIFT || eSlot == WEAPONSLOT_TYPE_PARACHUTE || eSlot == WEAPONSLOT_TYPE_DETONATOR) { // Grab the active cam CCamera* pCamera = g_pGame->GetCamera(); CCam* pActive = pCamera->GetCam(pCamera->GetActiveCam()); // Grab the camera matrix CMatrix matCamera; pCamera->GetMatrix(&matCamera); vecStart = matCamera.vPos; // Range float fRange; eWeaponType eWeapon = pLocalPlayer->GetCurrentWeaponType(); float fSkill = pLocalPlayer->GetStat(g_pGame->GetStats()->GetSkillStatIndex(eWeapon)); CWeaponStat* pWeaponStat = g_pGame->GetWeaponStatManager()->GetWeaponStatsFromSkillLevel(eWeapon, fSkill); if (pWeaponStat) { fRange = pWeaponStat->GetTargetRange(); } else { fRange = MELEE_VISIBLE_RANGE; } // Find the target position CVector vecFront = *pActive->GetFront(); vecFront.Normalize(); vecTarget = *pActive->GetSource() + vecFront * fRange; } else { // Grab the weapon and keysync state. If it exists and he holds Target down CWeapon* pPlayerWeapon = pLocalPlayer->GetWeapon(); if (pPlayerWeapon && State.RightShoulder1) { // Grab the gun muzzle position eWeaponType eWeapon = pLocalPlayer->GetCurrentWeaponType(); float fSkill = pLocalPlayer->GetStat(g_pGame->GetStats()->GetSkillStatIndex(eWeapon)); CWeaponStat* pWeaponStat = g_pGame->GetWeaponStatManager()->GetWeaponStatsFromSkillLevel(eWeapon, fSkill); CVector vecGunMuzzle = *pWeaponStat->GetFireOffset(); pLocalPlayer->GetTransformedBonePosition(BONE_RIGHTWRIST, vecGunMuzzle); // Grab the target point pCamera->Find3rdPersonCamTargetVector(AIM_VISIBLE_RANGE, &vecGunMuzzle, &vecStart, &vecTarget); } else { // Grab the active cam CCam* pActive = pCamera->GetCam(pCamera->GetActiveCam()); // Grab the camera matrix CMatrix matCamera; pCamera->GetMatrix(&matCamera); vecStart = matCamera.vPos; // Find the target position CVector vecFront = *pActive->GetFront(); vecFront.Normalize(); vecTarget = *pActive->GetSource() + vecFront * MELEE_VISIBLE_RANGE; } } // Ignore the local player for this pLocalPlayer->WorldIgnore(true); // Do the raycast CColPoint* pColPoint = NULL; CEntity* pEntity = NULL; SLineOfSightFlags flags; flags.bCheckBuildings = true; flags.bCheckVehicles = true; flags.bCheckPeds = true; flags.bCheckObjects = true; flags.bCheckDummies = true; flags.bSeeThroughStuff = true; flags.bIgnoreSomeObjectsForCamera = false; flags.bShootThroughStuff = true; g_pGame->GetWorld()->ProcessLineOfSight(&vecStart, &vecTarget, &pColPoint, &pEntity, flags); if (pColPoint) pColPoint->Destroy(); // Un-ignore the local player pLocalPlayer->WorldIgnore(false); // Did we find an entity? if (pEntity) { // Grab the CClientEntity belonging to this game_sa entity CClientEntity* pClientEntity = reinterpret_cast<CClientEntity*>(pEntity->GetStoredPointer()); if (pClientEntity) { // Is it a vehicle? Is it a ped? eClientEntityType EntityType = pClientEntity->GetType(); if (EntityType == CCLIENTVEHICLE) { CClientVehicle* pClientVehicle = static_cast<CClientVehicle*>(pClientEntity); // Set the current time as the last draw time for all players inside CClientPed* pPed; int i; for (i = 0; i < 8; i++) { // Grab this seat's occupant and set its last nametag show time to now pPed = pClientVehicle->GetOccupant(i); if (pPed && pPed->GetType() == CCLIENTPLAYER) { static_cast<CClientPlayer*>(pPed)->SetLastNametagShow(ulCurrentTime); } } } else if (EntityType == CCLIENTPLAYER) { // Grab the player this entity is CClientPlayer* pClientPlayer = static_cast<CClientPlayer*>(pClientEntity); if (pClientPlayer) { // Set now as the last time we had the cursor above him pClientPlayer->SetLastNametagShow(ulCurrentTime); } } } } // Grab the local player vehicle CClientVehicle* pLocalVehicle = pLocalPlayer->GetOccupiedVehicle(); // Draw the nametags we need to CClientPlayer* pPlayer; CClientStreamElement* pElement; list<CClientStreamElement*>::const_iterator iter = m_pPlayerStreamer->ActiveElementsBegin(); for (; iter != m_pPlayerStreamer->ActiveElementsEnd(); ++iter) { pElement = *iter; if (!pElement->IsStreamedIn()) continue; if (pElement->GetType() != CCLIENTPLAYER) continue; pPlayer = static_cast<CClientPlayer*>(pElement); if (pPlayer->IsLocalPlayer()) continue; // Is he in the same vehicle as the local player? if (pLocalVehicle && pPlayer->GetOccupiedVehicle() == pLocalVehicle) { pPlayer->SetLastNametagShow(ulCurrentTime); } // Can we show this player's nametag unsigned long ulLastNametagShow = pPlayer->GetLastNametagShow(); if (ulLastNametagShow != 0 && ulCurrentTime <= ulLastNametagShow + NAMETAG_END_FADE_TIME) { unsigned long ulLastNametagShow = pPlayer->GetLastNametagShow(); // Calculate the alpha modifier float fAlphaTimeModifier; if (ulCurrentTime < ulLastNametagShow + NAMETAG_BEGIN_FADE_TIME) { fAlphaTimeModifier = 1.0f; } else { fAlphaTimeModifier = 1.0f - (ulCurrentTime - ulLastNametagShow - NAMETAG_BEGIN_FADE_TIME) / 1000.0f; } // Calculate the alpha for the nametag unsigned char ucAlpha = static_cast<unsigned char>(180.0f * fAlphaTimeModifier); // Draw it DrawTagForPlayer(pPlayer, ucAlpha); } } } } }
void CNetworkStats::Draw ( void ) { // Time to update? if ( CClientTime::GetTime () >= m_ulLastUpdateTime + 1000 ) { Update(); } NetStatistics stats; g_pNet->GetNetworkStatistics ( &stats ); // Draw the background float fResWidth = static_cast < float > ( g_pCore->GetGraphics ()->GetViewportWidth () ); float fResHeight = static_cast < float > ( g_pCore->GetGraphics ()->GetViewportHeight () ); // Grab the bytes sent/recv and datarate in the proper unit SString strBytesSent = GetDataUnit ( stats.bytesSent ); SString strBytesRecv = GetDataUnit ( stats.bytesReceived ); SString strRecvRate = GetDataUnit ( Round ( m_fByteReceiveRate ) ); SString strSendRate = GetDataUnit ( Round ( m_fByteSendRate ) ); CClientPlayer* pLocalPlayer = g_pClientGame->GetLocalPlayer (); bool bBulletSync = pLocalPlayer && g_pClientGame->GetWeaponTypeUsesBulletSync ( pLocalPlayer->GetCurrentWeaponType () ); const SVehExtrapolateSettings& vehExtrapolateSettings = g_pClientGame->GetVehExtrapolateSettings (); SString strBuffer; // Select a string to print bool bHoldingCtrl = ( GetAsyncKeyState ( VK_CONTROL ) & 0x8000 ) != 0; if ( !bHoldingCtrl ) { strBuffer = SString ( "Ping: %u ms\n" "Messages in send buffer: %u\n" "Messages in resend buffer: %u\n" "Packets recv: %u\n" "Packets sent: %u\n" "Overall packet loss: %.2f%%\n" "Current packet loss: %.2f%%\n" "Bytes recv: %s\n" "Bytes sent: %s\n" "Datarate in/out: %s/s / %s/s\n" "Packet rate in/out: %u / %u\n" "BPS limit by CC: %llu\n" "BPS limit by OB: %llu\n" "Current wep bullet sync: %s\n" "Veh. Extrapolate amount: %d%%\n" "Veh. Extrapolate max: %dms\n" "Alternate pulse order: %s\n" "Client: %s\n" "Server: %s\n", g_pNet->GetPing (), stats.messagesInSendBuffer, stats.messagesInResendBuffer, stats.packetsReceived, stats.packetsSent, stats.packetlossTotal, stats.packetlossLastSecond, strBytesRecv.c_str (), strBytesSent.c_str (), strRecvRate.c_str (), strSendRate.c_str (), (unsigned int)floor(m_fPacketReceiveRate + 0.5f), (unsigned int)floor(m_fPacketSendRate + 0.5f), stats.isLimitedByCongestionControl ? 1ULL : 0ULL, stats.isLimitedByOutgoingBandwidthLimit ? 1ULL : 0ULL, bBulletSync ? "On" : "Off", vehExtrapolateSettings.iScalePercent, vehExtrapolateSettings.iMaxMs, g_pClientGame->IsUsingAlternatePulseOrder() ? "Yes" : "No", *CStaticFunctionDefinitions::GetVersionSortable(), *g_pClientGame->GetServerVersionSortable () ); } else { NetRawStatistics& r = stats.raw; strBuffer += SString ( "messageSendBuffer %d,%d,%d,%d\n", r.messageSendBuffer[0], r.messageSendBuffer[1], r.messageSendBuffer[2], r.messageSendBuffer[3] ); strBuffer += SString ( "messagesSent %d,%d,%d,%d\n", r.messagesSent[0], r.messagesSent[1], r.messagesSent[2], r.messagesSent[3] ); strBuffer += SString ( "messageDataBitsSent %lld,%lld,%lld,%lld\n", r.messageDataBitsSent[0], r.messageDataBitsSent[1], r.messageDataBitsSent[2], r.messageDataBitsSent[3] ); strBuffer += SString ( "messageTotalBitsSent %lld,%lld,%lld,%lld\n", r.messageTotalBitsSent[0], r.messageTotalBitsSent[1], r.messageTotalBitsSent[2], r.messageTotalBitsSent[3] ); strBuffer += SString ( "packetsContainingOnlyAcknowlegements %d\n", r.packetsContainingOnlyAcknowlegements ); strBuffer += SString ( "acknowlegementsSent %d\n", r.acknowlegementsSent ); strBuffer += SString ( "acknowlegementsPending %d\n", r.acknowlegementsPending ); strBuffer += SString ( "acknowlegementBitsSent %lld\n", r.acknowlegementBitsSent ); strBuffer += SString ( "packetsContainingOnlyAcksAndResends %d\n", r.packetsContainingOnlyAcknowlegementsAndResends ); strBuffer += SString ( "messageResends %d\n", r.messageResends ); strBuffer += SString ( "messageDataBitsResent %lld\n", r.messageDataBitsResent ); strBuffer += SString ( "messagesTotalBitsResent %lld\n", r.messagesTotalBitsResent ); strBuffer += SString ( "messagesOnResendQueue %d\n", r.messagesOnResendQueue ); strBuffer += SString ( "numberOfUnsplitMessages %d\n", r.numberOfUnsplitMessages ); strBuffer += SString ( "numberOfSplitMessages %d\n", r.numberOfSplitMessages ); strBuffer += SString ( "totalSplits %d\n", r.totalSplits ); strBuffer += SString ( "packetsSent %d\n", r.packetsSent ); strBuffer += SString ( "encryptionBitsSent %lld\n", r.encryptionBitsSent ); strBuffer += SString ( "totalBitsSent %lld\n", r.totalBitsSent ); strBuffer += SString ( "sequencedMessagesOutOfOrder %d\n", r.sequencedMessagesOutOfOrder ); strBuffer += SString ( "sequencedMessagesInOrder %d\n", r.sequencedMessagesInOrder ); strBuffer += SString ( "orderedMessagesOutOfOrder %d\n", r.orderedMessagesOutOfOrder ); strBuffer += SString ( "orderedMessagesInOrder %d\n", r.orderedMessagesInOrder ); strBuffer += SString ( "packetsReceived %d\n", r.packetsReceived ); strBuffer += SString ( "packetsWithBadCRCReceived %d\n", r.packetsWithBadCRCReceived ); strBuffer += SString ( "bitsReceived %lld\n", r.bitsReceived ); strBuffer += SString ( "bitsWithBadCRCReceived %lld\n", r.bitsWithBadCRCReceived ); strBuffer += SString ( "acknowlegementsReceived %d\n", r.acknowlegementsReceived ); strBuffer += SString ( "duplicateAcknowlegementsReceived %d\n", r.duplicateAcknowlegementsReceived ); strBuffer += SString ( "messagesReceived %d\n", r.messagesReceived ); strBuffer += SString ( "invalidMessagesReceived %d\n", r.invalidMessagesReceived ); strBuffer += SString ( "duplicateMessagesReceived %d\n", r.duplicateMessagesReceived ); strBuffer += SString ( "messagesWaitingForReassembly %d\n", r.messagesWaitingForReassembly ); strBuffer += SString ( "internalOutputQueueSize %d\n", r.internalOutputQueueSize ); strBuffer += SString ( "bitsPerSecond %0.0f\n", r.bitsPerSecond ); strBuffer += SString ( "connectionStartTime %lld\n", r.connectionStartTime ); strBuffer += SString ( "bandwidthExceeded %d\n", r.bandwidthExceeded ); } int iNumLines = 0; for ( int i = strBuffer.length () - 1 ; i >= 0 ; i-- ) if ( strBuffer[i] == '\n' ) iNumLines++; float fBackWidth = 310; float fBackHeight = (float)( iNumLines * 15 ); float fX = fResWidth - fBackWidth; float fY = 0.40f * fResHeight - iNumLines * 4; g_pCore->GetGraphics ()->DrawRectQueued ( fX - 10, fY - 10, fBackWidth + 10, fBackHeight + 20, 0x78000000, true ); g_pCore->GetGraphics ()->DrawTextQueued ( fX, fY, fX, fY, 0xFFFFFFFF, strBuffer, 1, 1, DT_NOCLIP, NULL, true ); }