Making a weapon that heal players

From Valve Developer Community
Revision as of 11:08, 23 September 2012 by Menmen92 (talk | contribs) (Created page with "== Purpouse == Here i will show you how to make weapons heal Players, useful for class based mods/games. == Constructor == First of all add this to your weapon constructor. m...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Purpouse

Here i will show you how to make weapons heal Players, useful for class based mods/games.

Constructor

First of all add this to your weapon constructor.

m_bDropped = 0; // this is to make sure the medic drops it one at a time

Primaryfire

This right here is working code that launches one health vial per single fire.

   if (!m_bDropped) { // if it hasnt been dropped...
  1. ifndef CLIENT_DLL
     CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); // get the player
     Vector   vecEye = pPlayer->EyePosition(); // Get the eye vector
     Vector   vForward, vRight; // create 2 new vectors
     pPlayer->EyeVectors( &vForward, &vRight, NULL );  // so we know what direction forward is
     Vector vecSrc = vecEye + vForward * 18.0f + vRight * 8.0f; // do some crazy math to find the source for our spawning
     trace_t tr; // we need a trace
     UTIL_TraceHull( vecEye, vecSrc, -Vector(6,6,6), Vector(6,6,6),
        pPlayer->PhysicsSolidMaskForEntity(), pPlayer, pPlayer->GetCollisionGroup(), &tr ); // to make sure we can spawn it without it being in anything else
     
     if ( tr.DidHit() ) // if we hit...
     {
        vecSrc = tr.endpos; // than something happens
     }
  //   CheckThrowPosition( pPlayer, vecEye, vecSrc );
  //   vForward[0] += 0.1f;
     vForward[2] += 0.1f; // something else
     Vector vecThrow;
     AngleVectors( pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), &vecThrow ); // get the vector fo the impulse on our health vial
     // pPlayer->GetVelocity( &vecThrow, NULL );
     VectorScale( vecThrow, 1000.0f, vecThrow ); // scale it down
     // vecThrow += vForward * 1200;
     CBaseEntity *pVial = NULL; // null and then!
     pVial = CBaseEntity::Create( "item_healthvial", pPlayer->Weapon_ShootPosition(), QAngle(80,60,0), pPlayer ); create that shit!
     pVial->AddSpawnFlags(SF_NORESPAWN); // DONT LET IT RESPAWN!
     if (!pVial) // have to have created it for it to be thrown
     {
        DevMsg("unable to create item\n");
     }else // YEA BIZZNATCH
     {
        DevMsg(2, "Starting item throw (Server)\n");
        IPhysicsObject *pPhysicsObject = pVial->VPhysicsGetObject(); // get the physics object
        if ( pPhysicsObject )
        {
           DevMsg(2, "Throwing item (Server)\n");
           pPhysicsObject->SetVelocity( &vecThrow, NULL );// throw that fuckin thing.
           
        }
     }
     m_bDropped = 1; // change the flag...
  1. endif
  } else {
     DevMsg(2, "Already dropped one. Release the button. (Server)\n"); // damnit gotta let go of that button.
  }


ItemPostFrame

if (!((pOwner->m_nButtons & IN_ATTACK) || (pOwner->m_nButtons & IN_ATTACK2) || (pOwner->m_nButtons & IN_RELOAD)))

  {
     m_bDropped = 0;
  }

Secondary Fire

If a player is too close from the medic/gun will health the player too.

//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponHealer::SecondaryAttack( void ) {

  if (CanHealPlayer())
     HealPlayer();

}

bool CWeaponHealer::CanHealPlayer( void ) {

  if (!m_bFired){
     CHL2MP_Player *pOwner = ToHL2MPPlayer( GetOwner() );
     if (!pOwner)
     {
        return false;
     }
     Vector vecSrc, vecAiming;
     // Take the eye position and direction
     vecSrc = pOwner->EyePosition();
     
     QAngle angles = pOwner->GetLocalAngles();
     AngleVectors( angles, &vecAiming );
     trace_t tr;
     Vector   vecEnd = vecSrc + (vecAiming * 42);
     UTIL_TraceLine( vecSrc, vecEnd, MASK_SOLID, pOwner, COLLISION_GROUP_NONE, &tr );
     
     if (tr.fraction < 1.0)
     {
        // Don\'t attach to a living creature
        if (tr.m_pEnt)
        {
           CBaseEntity *pEntity = tr.m_pEnt;
           CBaseCombatCharacter *pBCC      = ToBaseCombatCharacter( pEntity );
           if (pBCC)
           {
              if (pBCC->GetHealth()<100)
                 return true;
           }
        }
        return false;
     }
     else
     {
        return false;
     }
  }else {return false;}

} bool CWeaponHealer::HealPlayer( void ) {

  m_bFired = 1;
  CHL2MP_Player *pOwner = ToHL2MPPlayer( GetOwner() );
  if (!pOwner)
  {
     return false;
  }
  Vector vecSrc, vecAiming;
  // Take the eye position and direction
  vecSrc = pOwner->EyePosition();
  
  QAngle angles = pOwner->GetLocalAngles();
  AngleVectors( angles, &vecAiming );
  trace_t tr;
  Vector   vecEnd = vecSrc + (vecAiming * 42);
  UTIL_TraceLine( vecSrc, vecEnd, MASK_SOLID, pOwner, COLLISION_GROUP_NONE, &tr );
  
  if (tr.fraction < 1.0)
  {
     // Don\'t attach to a living creature
     if (tr.m_pEnt)
     {
        CBaseEntity *pEntity = tr.m_pEnt;
        if (pEntity->IsPlayer())
        {
           if (pEntity->GetHealth()<pEntity->GetMaxHealth())
           {
  1. ifndef CLIENT_DLL
              CBasePlayer *pPlayer = ToBasePlayer(pEntity);
              CPASAttenuationFilter filter( pPlayer, "HealthVial.Touch" );
              EmitSound( filter, pPlayer->entindex(), "HealthVial.Touch" );
              pEntity->TakeHealth( 20, DMG_GENERIC );
  1. endif
              return true;
           }
        }
     }
     return false;
  }
  else
  {
     return false;
  }

}