void CTripmineGrenade :: MakeBeam( void ) { TraceResult tr; // ALERT( at_console, "serverflags %f\n", gpGlobals->serverflags ); UTIL_TraceLine( pev->origin, m_vecEnd, dont_ignore_monsters, ENT( pev ), &tr ); m_flBeamLength = tr.flFraction; // set to follow laser spot SetThink( &CTripmineGrenade::BeamBreakThink ); pev->nextthink = gpGlobals->time + 0.1; Vector vecTmpEnd = pev->origin + m_vecDir * 2048 * m_flBeamLength; m_pBeam = CBeam::BeamCreate( g_pModelNameLaser, 10 ); m_pBeam->PointEntInit( vecTmpEnd, entindex() ); m_pBeam->SetColor( 0, 214, 198 ); m_pBeam->SetScrollRate( 255 ); m_pBeam->SetBrightness( 64 ); }
void CGenericMonster::MakeGas( void ) { Vector posGun, angleGun; TraceResult tr; UTIL_MakeVectors( pev->angles ); { KillGas(); m_pBeam = CBeam::BeamCreate( "sprites/laserbeam.spr", 7 ); if ( m_pBeam ) { GetAttachment( 4, posGun, angleGun ); GetAttachment( 3, posGun, angleGun ); Vector vecEnd = (gpGlobals->v_forward * 5) + posGun; UTIL_TraceLine( posGun, vecEnd, dont_ignore_monsters, edict(), &tr ); m_pBeam->EntsInit( edict(), edict() ); m_pBeam->SetColor( 24, 121, 239 ); m_pBeam->SetBrightness( 190 ); m_pBeam->SetScrollRate( 20 ); m_pBeam->SetStartAttachment( 4 ); m_pBeam->SetEndAttachment( 3 ); m_pBeam->DamageDecal( 28 ); m_pBeam->DoSparks( tr.vecEndPos, posGun ); m_pBeam->SetFlags( FBEAM_SHADEIN ); m_pBeam->RelinkBeam(); UTIL_Sparks( tr.vecEndPos ); UTIL_DecalTrace(&tr, 28 + RANDOM_LONG(0,4)); } } // m_flNextAttack = gpGlobals->time + RANDOM_FLOAT( 0.5, 4.0 ); if ( int gas = 1 ) { pev->nextthink = gpGlobals->time; } }
void CTestEffect::TestThink( void ) { int i; float t = (gpGlobals->time - m_flStartTime); if (m_iBeam < 24) { CBeam *pbeam = CBeam::BeamCreate( "sprites/lgtning.spr", 100 ); TraceResult tr; Vector vecSrc = pev->origin; Vector vecDir = Vector( RANDOM_FLOAT( -1.0, 1.0 ), RANDOM_FLOAT( -1.0, 1.0 ),RANDOM_FLOAT( -1.0, 1.0 ) ); vecDir = vecDir.Normalize(); UTIL_TraceLine( vecSrc, vecSrc + vecDir * 128, ignore_monsters, ENT(pev), &tr); pbeam->PointsInit( vecSrc, tr.vecEndPos ); // pbeam->SetColor( 80, 100, 255 ); pbeam->SetColor( 255, 180, 100 ); pbeam->SetWidth( 100 ); pbeam->SetScrollRate( 12 ); m_flBeamTime[m_iBeam] = gpGlobals->time; m_pBeam[m_iBeam] = pbeam; m_iBeam++; #if 0 Vector vecMid = (vecSrc + tr.vecEndPos) * 0.5; MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE(TE_DLIGHT); WRITE_COORD(vecMid.x); // X WRITE_COORD(vecMid.y); // Y WRITE_COORD(vecMid.z); // Z WRITE_BYTE( 20 ); // radius * 0.1 WRITE_BYTE( 255 ); // r WRITE_BYTE( 180 ); // g WRITE_BYTE( 100 ); // b WRITE_BYTE( 20 ); // time * 10 WRITE_BYTE( 0 ); // decay * 0.1 MESSAGE_END( ); #endif } if (t < 3.0) { for (i = 0; i < m_iBeam; i++) { t = (gpGlobals->time - m_flBeamTime[i]) / ( 3 + m_flStartTime - m_flBeamTime[i]); m_pBeam[i]->SetBrightness( 255 * t ); // m_pBeam[i]->SetScrollRate( 20 * t ); } pev->nextthink = gpGlobals->time + 0.1; } else { for (i = 0; i < m_iBeam; i++) { UTIL_Remove( m_pBeam[i] ); } m_flStartTime = gpGlobals->time; m_iBeam = 0; // pev->nextthink = gpGlobals->time; SetThink( NULL ); } }
void CLocusBeam::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { CBaseEntity *pStartEnt; CBaseEntity *pEndEnt; Vector vecStartPos; Vector vecEndPos; CBeam *pBeam; switch(pev->impulse) { case 0: // ents pStartEnt = UTIL_FindEntityByTargetname(NULL, STRING(m_iszStart), pActivator); pEndEnt = UTIL_FindEntityByTargetname(NULL, STRING(m_iszEnd), pActivator); if (pStartEnt == NULL || pEndEnt == NULL) return; pBeam = CBeam::BeamCreate( STRING(m_iszSprite), m_iWidth ); pBeam->EntsInit( pStartEnt->entindex(), pEndEnt->entindex() ); break; case 1: // pointent vecStartPos = CalcLocus_Position( this, pActivator, STRING(m_iszStart) ); pEndEnt = UTIL_FindEntityByTargetname(NULL, STRING(m_iszEnd), pActivator); if (pEndEnt == NULL) return; pBeam = CBeam::BeamCreate( STRING(m_iszSprite), m_iWidth ); pBeam->PointEntInit( vecStartPos, pEndEnt->entindex() ); break; case 2: // points vecStartPos = CalcLocus_Position( this, pActivator, STRING(m_iszStart) ); vecEndPos = CalcLocus_Position( this, pActivator, STRING(m_iszEnd) ); pBeam = CBeam::BeamCreate( STRING(m_iszSprite), m_iWidth ); pBeam->PointsInit( vecStartPos, vecEndPos ); break; case 3: // point & offset vecStartPos = CalcLocus_Position( this, pActivator, STRING(m_iszStart) ); vecEndPos = CalcLocus_Velocity( this, pActivator, STRING(m_iszEnd) ); pBeam = CBeam::BeamCreate( STRING(m_iszSprite), m_iWidth ); pBeam->PointsInit( vecStartPos, vecStartPos + vecEndPos ); break; } pBeam->SetColor( pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z ); pBeam->SetBrightness( pev->renderamt ); pBeam->SetNoise( m_iDistortion ); pBeam->SetFrame( m_fFrame ); pBeam->SetScrollRate( m_iScrollRate ); pBeam->SetFlags( m_iFlags ); pBeam->pev->dmg = m_fDamage; pBeam->pev->frags = m_iDamageType; pBeam->pev->spawnflags |= pev->spawnflags & (SF_BEAM_RING | SF_BEAM_SPARKSTART | SF_BEAM_SPARKEND | SF_BEAM_DECALS); if (m_fDuration) { pBeam->SetThink(&CBeam:: SUB_Remove ); pBeam->SetNextThink( m_fDuration ); } pBeam->pev->targetname = m_iszTargetName; if (pev->target) { FireTargets( STRING(pev->target), pBeam, this, USE_TOGGLE, 0 ); } }
void CGrappleHook::Move( void ) { // Fograin92: If owner (player) is dead if( !myowner->IsAlive() ) { Killed(pev, 0); // Remove tongue instantly return; } // Fograin92: Player isn't holding attack buttons if( !(myowner->pev->button & (IN_ATTACK|IN_ATTACK2)) ) { bPullBack = true; // Fograin92: We should pull the tongue back } // Fograin92: Animate pull-back tongue animation ONLY if we didn't hit a monster if(bPullBack) { UTIL_MakeVectors( myowner->pev->v_angle + myowner->pev->punchangle ); Vector GunPosition = myowner->GetGunPosition(); GunPosition = GunPosition + gpGlobals->v_up * -4 + gpGlobals->v_right * 3 + gpGlobals->v_forward * 6; pev->velocity = (GunPosition - pev->origin) * 10; // Pull back the tongue tip float fDistance = (GunPosition - pev->origin).Length2D(); // Calculate distance between tongue tip and player //ALERT( at_console, "^2HLU -> ^3weapon_grapple ^2-> %f\n", fDistance ); if (fDistance < 40) { Killed(pev, 0); return; } } else { // Fograin92: We did hit a monster if(m_iHitMonster > 0) { // Fograin92: Let's "stick" grapple tongue XYZ to target's center XYZ pev->origin = myHitMonster->Center(); // Fograin92: We did hit tiny monster, let's pull it if(m_iHitMonster == 2) { myHitMonster->pev->movetype = MOVETYPE_FLY; // Remove gravity effect on our pulled monster myHitMonster->pev->velocity = (myowner->pev->origin - myHitMonster->pev->origin) * 4; // Pull our monster } // Fograin92: Check distance (player <-> monster) float fDistance = (myowner->pev->origin - myHitMonster->pev->origin).Length2D(); // Fograin92: The monster is very close to player, let's OWN IT! if (fDistance < 40) { ALERT( at_console, "^2HLU -> ^3weapon_grapple ^2-> OWNED -> ^3%s\n", STRING(myHitMonster->pev->classname) ); // Fograin92: Did we pull the gib? if( myHitMonster->Classify() == CLASS_GIBS ) myHitMonster->SUB_Remove(); else myHitMonster->TakeDamage(myHitMonster->pev, myowner->pev, 10000, DMG_GENERIC); Killed(pev, 0); // Fograin92: Target died, kill tongue } } } // Fograin92: If tongue (beam) exists if( m_pTongue ) { UTIL_MakeVectors( myowner->pev->v_angle + myowner->pev->punchangle ); Vector GunPosition = myowner->GetGunPosition(); GunPosition = GunPosition + gpGlobals->v_up * -4 + gpGlobals->v_right * 3 + gpGlobals->v_forward * 6; m_pTongue->PointEntInit( GunPosition, this->entindex() ); } else { // Fograin92: Create tongue (beam) m_pTongue = CBeam::BeamCreate( "sprites/_tongue.spr", 8 ); m_pTongue->SetFlags( 0x20 ); // Solid beam m_pTongue->SetColor( 100, 100, 100 ); m_pTongue->SetScrollRate( 20 ); } pev->nextthink = gpGlobals->time + 0.01; }