Example #1
0
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);
                }
            }
        }
    }
}
Example #2
0
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 );
}