Advertisement
Guest User

CBasePlayer::TakeDamage (not complete)

a guest
Feb 26th, 2012
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.72 KB | None | 0 0
  1. #define ARMOR_RATIO  0.5    // Armor Takes 80% of the damage
  2. #define ARMOR_BONUS  0.5    // Each Point of Armor is work 1/x points of health
  3.  
  4. int CBasePlayer::TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType )
  5. {
  6.     float       flRatioShield;
  7.     float       flBonus;
  8.     float       flRatio;
  9.     int         iTookDamage;
  10.     PLAYER_ANIM iAnim;
  11.     bool        bHasKevlar;
  12.  
  13.     if( bitsDamageType & ( DMG_GRENADE | DMG_BLAST | DMG_FALL ) )
  14.     {
  15.         m_LastHitGroup = HITGROUP_GENERIC;
  16.     }
  17.  
  18.     if( m_LastHitGroup == HITGROUP_SHIELD && bitsDamageType & DMG_BULLET )
  19.     {
  20.         return 0;
  21.     }
  22.  
  23.     flRatioShield = 0;
  24.  
  25.     flBonus = ARMOR_BONUS;
  26.     flRatio = ARMOR_RATIO;
  27.  
  28.     if( HasShield() )
  29.     {
  30.         flRatioShield = 0.2;
  31.     }
  32.  
  33.     if( m_fIsVIP )
  34.     {
  35.         flRatio = 0.25;
  36.     }
  37.  
  38.     if( bitsDamageType & ( DMG_GRENADE | DMG_BLAST ) )
  39.     {
  40.         if( !IsAlive() )
  41.         {
  42.             return 0;
  43.         }
  44.  
  45.         CBaseEntity *pInflictor = CBaseEntity::Instance( pevInflictor );
  46.  
  47.         if( bitsDamageType & DMG_GRENADE )
  48.         {
  49.             if( !strcmp( STRING( pInflictor->pev->classname ), "grenade" ) )
  50.             {
  51.                 if( !CVAR_GET_FLOAT( "mp_friendlyfire" ) )
  52.             }
  53.         }
  54.     }
  55.  
  56.  
  57.     if( ~bitsDamageType & ( DMG_GRENADE | DMG_BLAST ) )
  58.     {
  59.         CBaseEntity *pInflictor = CBaseEntity::Instance( pevInflictor );
  60.  
  61.         if( !g_pGameRules->FPlayerCanTakeDamage( this, pInflictor ) && strcmp( STRING( pInflictor->pev->classname ), "grenade" ) )
  62.         {
  63.             return 0;
  64.         }
  65.  
  66.         if( ( bitsDamageType & DMG_BLAST ) && g_pGameRules->IsMultiplayer() )
  67.         {
  68.             flBonus *= 2;
  69.         }
  70.  
  71.         if( !IsAlive() )
  72.         {
  73.             return 0;
  74.         }
  75.  
  76.         CBaseEntity *pEntity = GetClassPtr( (CBaseEntity *)pevAttacker );
  77.  
  78.         if( pEntity && pEntity->IsPlayer() )
  79.         {
  80.             CBasePlayer *pAttacker = GetClassPtr( (CBasePlayer *)pevAttacker );
  81.  
  82.             if( pAttacker != this && pAttacker->m_iTeam == m_iTeam )
  83.             {
  84.                 if( !FBitSet( pAttacker->m_fHintMessageHistory, Hint_try_not_to_injure_teammates ) )
  85.                 {
  86.                     pAttacker->m_fHintMessageHistory |= Hint_try_not_to_injure_teammates;
  87.                     pAttacker->HintMessage( "#Hint_try_not_to_injure_teammates", FALSE, FALSE );
  88.                 }
  89.  
  90.                 if( m_flNextGameTeamAttack + 0.6 < gpGlobals->time )
  91.                 {
  92.                     m_flNextGameTeamAttack = gpGlobals->time;
  93.  
  94.                     CBaseEntity *pEntity = NULL;
  95.  
  96.                     while( ( pEntity = UTIL_FindEntityByClassname( pEntity, "player" ) ) != NULL )
  97.                     {
  98.                         if( !FNullEnt( pEntity ) )
  99.                         {
  100.                             CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pEntity->pev );
  101.  
  102.                             if( pPlayer->m_iTeam == m_iTeam )
  103.                             {
  104.                                 ClientPrint( pPlayer->pev, HUD_PRINTCENTER, "#Game_teammate_attack", STRING( this->pev->netname ) );
  105.                             }
  106.                         }
  107.                     }
  108.                 }
  109.  
  110.                 flDamage *= 0.35;
  111.             }
  112.  
  113.             CBasePlayerItem *pActiveItem = pAttacker->m_pActiveItem;
  114.             int iAttackerWeaponId = pActiveItem->m_iId;
  115.  
  116.             if( pActiveItem )
  117.             {
  118.                 float flWeaponRatio;
  119.  
  120.                 flRatio += flRatioShield;
  121.  
  122.                 switch( iAttackerWeaponId )
  123.                 {
  124.                 case WEAPON_AWP       : flWeaponRatio = 1.95; break;
  125.                 case WEAPON_G3SG1     : flWeaponRatio = 1.65; break;
  126.                 case WEAPON_SG550     : flWeaponRatio = 1.45; break;
  127.  
  128.                 case WEAPON_ELITE     : flWeaponRatio = 1.05; break;
  129.                 case WEAPON_GLOCK18   : flWeaponRatio = 1.05; break;
  130.  
  131.                 case WEAPON_FIVESEVEN : flWeaponRatio = 1.50; break;
  132.                 case WEAPON_M249      : flWeaponRatio = 1.50; break;
  133.                 case WEAPON_DEAGLE    : flWeaponRatio = 1.50; break;
  134.                 case WEAPON_P90       : flWeaponRatio = 1.50; break;
  135.  
  136.                 case WEAPON_MAC10     : flWeaponRatio = 0.95; break;
  137.                 case WEAPON_P228      : flWeaponRatio = 1.25; break;
  138.  
  139.                 case WEAPON_SCOUT     : flWeaponRatio = 1.70; break;
  140.                 case WEAPON_KNIFE     : flWeaponRatio = 1.70; break;
  141.  
  142.                 case WEAPON_AUG       : flWeaponRatio = 1.40; break;
  143.                 case WEAPON_FAMAS     : flWeaponRatio = 1.40; break;
  144.                 case WEAPON_M4A1      : flWeaponRatio = 1.40; break;
  145.                 case WEAPON_SG552     : flWeaponRatio = 1.40; break;
  146.  
  147.                 case WEAPON_GALIL     : flWeaponRatio = 1.55; break;
  148.                 case WEAPON_AK47      : flWeaponRatio = 1.55; break;
  149.                 }
  150.  
  151.                 flRatio *= flWeaponRatio;
  152.             }
  153.  
  154.             if( ShouldDoLargeFlinch( m_LastHitGroup, iAttackerWeaponId ) )
  155.             {
  156.                 if( pev->velocity.Length() < 300 )
  157.                 {
  158.                     pev->velocity = pev->velocity + ( pev->origin - pAttacker->pev->origin ).Normalize() * 170;
  159.                     m_flPainShock = 0.65;
  160.                 }
  161.  
  162.                 iAnim = PLAYER_LARGE_FLINCH;
  163.             }
  164.             else
  165.             {
  166.                 m_flPainShock = 0.50;
  167.                 m_fKilledByHeadshot = FALSE;
  168.  
  169.                 if( m_LastHitGroup == HITGROUP_HEAD && flDamage > 60 )
  170.                 {
  171.                     m_fKilledByHeadshot = TRUE;
  172.                 }
  173.                 else if( flDamage <= 20 )
  174.                 {
  175.                     m_fKilledByHeadshot = FALSE;
  176.                 }
  177.  
  178.                 iAnim = PLAYER_SMALL_FLINCH;
  179.             }
  180.  
  181.             SetAnimation( iAnim );
  182.         }
  183.  
  184.         m_lastDamageAmount = flDamage;
  185.  
  186.         if( !pev->armorvalue || bitsDamageType & ( DMG_FALL | DMG_DROWN ) || !IsArmored( m_LastHitGroup ) )
  187.         {
  188.             bHasKevlar = false;
  189.         }
  190.         else
  191.         {
  192.             float flNew   = flDamage * flRatio;
  193.             float flArmor = ( flDamage - flNew ) * flBonus;
  194.  
  195.             if( flArmor > pev->armorvalue )
  196.             {
  197.                 flArmor = ( 1 / flBonus ) * pev->armorvalue;
  198.                 flNew   = flDamage - flArmor;
  199.  
  200.                 pev->armorvalue = 0;
  201.             }
  202.             else
  203.             {
  204.                 if( flArmor < 0 )
  205.                     flArmor = 1.0;
  206.  
  207.                 pev->armorvalue -= flArmor;
  208.             }
  209.  
  210.             flDamage = flNew;
  211.  
  212.             if( pev->armorvalue < 0 )
  213.                 m_iKevlar = 0;
  214.  
  215.             bHasKevlar = true;
  216.         }
  217.  
  218.         Pain( m_LastHitGroup, bHasKevlar );
  219.  
  220.         LogAttack( pAttacker, this, _, _, _, pev->health - flNew, pev->armorvalue, GetWeaponName( this->pev, pInflictor ) );
  221.  
  222.         iTookDamage = CBaseMonster::TakeDamage( pevInflictor, pevAttacker, (int)flDamage, bitsDamageType );
  223.  
  224.         if( iTookDamage )
  225.         {
  226.             /*! @todo Implements this :
  227.             if( TheBots )
  228.                 TheBots->OnEvent( EVENT_PLAYER_TOOK_DAMAGE, pevAttacker, this ); */
  229.  
  230.             if( g_pGameRules->IsCareer() )
  231.             {
  232.                 for( int i = 1; i <= gpGlobals->maxClients; ++i )
  233.                 {
  234.                     CBasePlayer* pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( i );
  235.  
  236.                     if( pPlayer && !pPlayer->IsBot() && pPlayer->pev == pevAttacker && pPlayer->m_iTeam != m_iTeam )
  237.                     {
  238.                         /*! @todo Implements this :
  239.                         TheCareerTasks->HandleEnemyInjury( GetWeaponName( pevInflictor, pevAttacker ), pPlayer->HasShield(), pPlayer ); */
  240.                     }
  241.                 }
  242.             }
  243.         }
  244.  
  245.         for( int i = 0; i < CDMG_TIMEBASED; i++ )
  246.         {
  247.             if( bitsDamageType & ( DMG_PARALYZE << i ) )
  248.             {
  249.                 m_rgbTimeBasedDamage[i] = 0;
  250.             }
  251.         }
  252.  
  253.         MESSAGE_BEGIN( MSG_SPEC, SVC_DIRECTOR );
  254.             WRITE_BYTE ( 9 );                               // command length in bytes
  255.             WRITE_BYTE ( DRC_CMD_EVENT );                   // take damage event
  256.             WRITE_SHORT( ENTINDEX( this->edict() ) );       // index number of primary entity
  257.             WRITE_SHORT( ENTINDEX(ENT( pevInflictor ) ) );  // index number of secondary entity
  258.             WRITE_LONG( 5 );                                // eventflags (priority and flags)
  259.         MESSAGE_END();
  260.  
  261.         int health = pev->health;
  262.  
  263.         if( health < 0 )
  264.             health = 0;
  265.  
  266.         MESSAGE_BEGIN( MSG_SPEC, gmsgHLTV );
  267.             WRITE_BYTE( ENTINDEX( this->edict() ) );
  268.             WRITE_BYTE( health );
  269.         MESSAGE_END();
  270.  
  271.         for( int i = 1; i <= gpGlobals->maxClients; ++i )
  272.         {
  273.             CBasePlayer* pPlayer = (CBasePlayer *)UTIL_PlayerByIndex( i );
  274.  
  275.             if( pPlayer && m_hObserverTarget == this )
  276.             {
  277.                 int health = pPlayer->pev->health;
  278.  
  279.                 if( health < 0 )
  280.                     health = 0;
  281.  
  282.                 MESSAGE_BEGIN( MSG_ONE, gmsgSpecHealth, NULL, ENT( pPlayer->pev ) );
  283.                     WRITE_BYTE( health );
  284.                 MESSAGE_END();
  285.             }
  286.         }
  287.  
  288.         m_bitsDamageType |= bitsDamageType; // Save this so we can report it to the client
  289.         m_bitsHUDDamage = -1;               // make sure the damage bits get resent
  290.  
  291.         return iTookDamage;
  292.     }
  293.     else
  294.     {
  295.         if( !IsAlive() )
  296.         {
  297.             return 0;
  298.         }
  299.  
  300.         CBaseEntity *pInflictor = CBaseEntity::Instance( pevInflictor );
  301.  
  302.         if( bitsDamageType & DMG_GRENADE )
  303.         {
  304.             if( !strcmp( STRING( pInflictor->pev->classname ), "grenade" ) )
  305.             {
  306.                 if( !CVAR_GET_FLOAT( "mp_friendlyfire" ) )
  307.             }
  308.         }
  309.     }
  310.  
  311.  
  312.  
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement