Making a weapon that heal players: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
(cleanup, pov)
Line 1: Line 1:
{{cleanup|Spelling and grammar.}}
{{cleanup|Spelling and grammar.}}
{{pov}}
{{pov}}
== Purpouse ==
== Purpose ==


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

Revision as of 11:42, 24 September 2012

Broom icon.png
This article or section needs to be cleaned up to conform to a higher standard of quality because:
Spelling and grammar.
For help, see the VDC Editing Help and Wikipedia cleanup process. Also, remember to check for any notes left by the tagger at this article's talk page.
Broom icon.png
This article or section should be converted to third person to conform to wiki standards.

Purpose

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...
#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...
#endif
   } else {
      DevMsg(2, "Already dropped one. Release the button. (Server)\n"); // damnit gotta let go of that button.
   }

ItemPostFrame

We will add this to the itempostframe in the weapon.

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())
            {
#ifndef CLIENT_DLL
               CBasePlayer *pPlayer = ToBasePlayer(pEntity);

               CPASAttenuationFilter filter( pPlayer, "HealthVial.Touch" );
               EmitSound( filter, pPlayer->entindex(), "HealthVial.Touch" );
               pEntity->TakeHealth( 20, DMG_GENERIC );
#endif
               return true;
            }
         }
      }
      return false;
   }
   else
   {
      return false;
   }
}