Talk:Making a weapon that heal players

From Valve Developer Community
Jump to navigation Jump to search

I was pretty terrified on how terrible this article was, so I decided to register and work on it a little bit. All of the first and second PoV's have been reworded to a standard of 3rd PoV. I also brushed up on fixing the page title as parts of the name was capitalized. I've worked on the spelling and grammar a bit. If there's any mistake, feel free to correct them.

Oh, and I'd appreciate meeting you all, as I'm quite new here. --Swog 23:44, 7 October 2012 (PDT)

Making a weapon that heal players:es

Constructor

El siguiente bloque de código es una variable entera.

m_bDropped = 0; // Esto es para asegurarse de que el médico lo deja caer de uno en uno

Primary Fire "Fuego primario"

El disparo primario del arma deja caer un objeto de salud por disparo. Se han añadido comentarios para mayor claridad.

   if (!m_bDropped) { // Si la ampolla "vial" de la salud no se ha caído, continúa
#ifndef CLIENT_DLL
      CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); // Agarrar al portador

      Vector   vecEye = pPlayer->EyePosition(); // Obtén el vector del ojo del portador
      Vector   vForward, vRight; // Crear 2 nuevos vectores

      pPlayer->EyeVectors( &vForward, &vRight, NULL );  // Obtener la dirección hacia adelante
      Vector vecSrc = vecEye + vForward * 18.0f + vRight * 8.0f; // Encontrar la fuente de desove
      trace_t tr; // Obtiene el rastro

      UTIL_TraceHull( vecEye, vecSrc, -Vector(6,6,6), Vector(6,6,6),
         pPlayer->PhysicsSolidMaskForEntity(), pPlayer, pPlayer->GetCollisionGroup(), &tr ); // Checks if anything in front of it
      
      if ( tr.DidHit() ) // Si se golpea
      {
         vecSrc = tr.endpos; // Dejar en el lugar
      }

   //   CheckThrowPosition( pPlayer, vecEye, vecSrc );
   //   vForward[0] += 0.1f;
      vForward[2] += 0.1f; // Algo más

      Vector vecThrow;
      AngleVectors( pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), &vecThrow ); // Get Vector for Impulse on Health Vial
      // pPlayer->GetVelocity( &vecThrow, NULL );
      VectorScale( vecThrow, 1000.0f, vecThrow ); // Ampliación de la escala de la ampolla
      // vecThrow += vForward * 1200;

      CBaseEntity *pVial = NULL; // Null
      pVial = CBaseEntity::Create( "item_healthvial", pPlayer->Weapon_ShootPosition(), QAngle(80,60,0), pPlayer ); // Creates
      pVial->AddSpawnFlags(SF_NORESPAWN); // No permite el respawning
      if (!pVial) // Has to have to be created to throw it
      {
         DevMsg("Unable to create item!\n");
      }else // Works
      {
         DevMsg(2, "Starting item throw (Server)\n");

         IPhysicsObject *pPhysicsObject = pVial->VPhysicsGetObject(); // Obtener el objeto físico
         if ( pPhysicsObject )
         {
            DevMsg(2, "Throwing item (Server)\n");
            pPhysicsObject->SetVelocity( &vecThrow, NULL );// Tirar la ampolla "vial"
            
         }
      }
      m_bDropped = 1; // Cambiar bandera "flag"
#endif
   } else {
      DevMsg(2, "Already dropped one. Release the button. (Server)\n"); // Suelta el botón
   }
   }

Item Post Frame

This block of code will add 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 "Fuego secundario"

Si el jugador(es) está(n) demasiado cerca del médico o del arma, lo(s) curará(n).

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CWeaponHealer::SecondaryAttack( void ) 
{
   if (CanHealPlayer()) // Comprueba si puede curarse
      HealPlayer(); // Método de ejecución
}

bool CWeaponHealer::CanHealPlayer( void ) // Comprueba el booleano
{
   if (!m_bFired){ // Si no se ha disparado,
      CHL2MP_Player *pOwner = ToHL2MPPlayer( GetOwner() ); // Get owner of this weapon

      if (!pOwner) // Si el propietario no existe
      {
         return false; // Terminar código
      }

      Vector vecSrc, vecAiming; // Crear vectores utilizados para el fuego secundario

      // Tomar la posición y la dirección de los ojos
      vecSrc = pOwner->EyePosition();
      
      QAngle angles = pOwner->GetLocalAngles(); // Obtener ángulos locales

      AngleVectors( angles, &vecAiming );

      trace_t tr; // Crear un nuevo rastro para utilizar

      Vector   vecEnd = vecSrc + (vecAiming * 42);
      UTIL_TraceLine( vecSrc, vecEnd, MASK_SOLID, pOwner, COLLISION_GROUP_NONE, &tr );
      
      if (tr.fraction < 1.0)
      {
         // No te pegues a un ser vivo
         if (tr.m_pEnt)
         {
            CBaseEntity *pEntity = tr.m_pEnt;
            CBaseCombatCharacter *pBCC      = ToBaseCombatCharacter( pEntity );
            if (pBCC)
            {
               if (pBCC->GetHealth()<100) // Si el jugador no tiene 100 de salud
                  return true; // Return true to 
            }
         }
         return false; // Si no, devuelve false
      }
      else
      {
         return false;
      }
   }else {return false;}
}
bool CWeaponHealer::HealPlayer( void ) // Declaración del jugador sanado
{
   m_bFired = 1; // Lo establece como disparado

   CHL2MP_Player *pOwner = ToHL2MPPlayer( GetOwner() ); // Obtenga el objeto de la ampolla "vial" de la salud

   if (!pOwner) // If Owner is no longer in server
   {
      return false; // Terminar el código
   }

   Vector vecSrc, vecAiming;

   // Tomar la posición y la dirección de los ojos
   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)
   {
      // No te pegues a un ser vivo
      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" ); // Filters "Filtros"
               EmitSound( filter, pPlayer->entindex(), "HealthVial.Touch" ); // encender sonido de HealthVial.Touch
               pEntity->TakeHealth( 20, DMG_GENERIC ); // Daño 20 salud bajo razón genérica
#endif
               return true;
            }
         }
      }
      return false;
   }
   else
   {
      return false;
   }
}
}