Talk:Making a weapon that heal players
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)
Contents
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;
}
}
}