Source SDK

Source SDK

Not enough ratings
Hacer un objeto en formato de arma que cure a los jugadores - Motor Source
By Oitnemood
Este tutorial te mostrará cómo crear un objeto en formato de arma que cura a los jugadores que la usan.

guía original de valve
https://developer.valvesoftware.com/wiki/Making_a_weapon_that_heal_players
   
Award
Favorite
Favorited
Unfavorite
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 }
Secondary Fire "Fuego secundario"
Si el jugador(es) está(n) demasiado cerca del médico o del arma, lo(s) curará(n).
//----------------------------------------------------------------------------- // 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; } }