Making a weapon that heal players
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...
#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
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; }
}