void CGERocket::IgniteThink( void ) { EmitSound( "Weapon_RocketLauncher.Ignite" ); AngleVectors( GetLocalAngles(), &m_vForward ); AngleVectors(GetLocalAngles() + QAngle(-90, 0, 0), &m_vUp); m_vRight = CrossProduct(m_vForward, m_vUp); // SetAbsVelocity( m_vForward * GE_ROCKET_MAXVEL * 0.1f ); SetThink( &CGERocket::AccelerateThink ); SetNextThink(gpGlobals->curtime + m_fthinktime); m_fthinktime = 0.1; m_fFuseTime = gpGlobals->curtime + GE_ROCKET_FUSETIME / max(phys_timescale.GetFloat(), 0.01); CreateSmokeTrail(); /* DevMsg("modifiers are.."); if (m_iseed1 < 50) // Vertical Sine Wave DevMsg(", sine"); if (m_iseed1 % 50 < 25) // Horizontal Cosine Wave, overlap with sine wave causes spiral. DevMsg(", cosine"); if (m_iseed1 % 25 < 5) // Comes back DevMsg(", return"); if (m_iseed1 % 20 < 5) // Gravity DevMsg(", gravity"); if (m_iseed1 % 10 < 4) // Random Jitter DevMsg(", jitter"); DevMsg(", and seed 1 is %d, seed 2 is %d, seed 3 is %d.", m_iseed1, m_iseed2, m_iseed3); */ }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CDODBaseRocket::Spawn( void ) { Precache(); SetSolid( SOLID_BBOX ); Assert( GetModel() ); //derived classes must have set model UTIL_SetSize( this, -Vector(2,2,2), Vector(2,2,2) ); SetTouch( &CDODBaseRocket::RocketTouch ); SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_CUSTOM ); m_takedamage = DAMAGE_NO; SetGravity( 0.1 ); SetDamage( mp_rocketdamage.GetFloat() ); AddFlag( FL_OBJECT ); SetCollisionGroup( COLLISION_GROUP_PROJECTILE ); EmitSound( "Weapon_Bazooka.Shoot" ); // Smoke trail. CreateSmokeTrail(); SetThink( &CDODBaseRocket::FlyThink ); SetNextThink( gpGlobals->curtime ); }
void CRocketMissile::IgniteThink( void ) { SetMoveType( MOVETYPE_FLY ); SetModel("models/weapons/w_missile.mdl"); UTIL_SetSize( this, vec3_origin, vec3_origin ); RemoveSolidFlags( FSOLID_NOT_SOLID ); //TODO: Play opening sound Vector vecForward; EmitSound( "Missile.Ignite" ); AngleVectors( GetLocalAngles(), &vecForward ); SetAbsVelocity( vecForward * BALANCE_VALUE( Float, lfm_rocket_launcher_speed ) ); // Hmmm... //SetThink( &CRocketMissile::SeekThink ); //SetNextThink( gpGlobals->curtime ); if ( m_hOwner && m_hOwner->GetOwner() ) { CBasePlayer *pPlayer = ToBasePlayer( m_hOwner->GetOwner() ); color32 white = { 255,225,205,64 }; UTIL_ScreenFade( pPlayer, white, 0.1f, 0.0f, FFADE_IN ); } CreateSmokeTrail(); }
//----------------------------------------------------------------------------- // Purpose: Stops any kind of tracking and shoots dumb //----------------------------------------------------------------------------- void CDODBaseRocket::Fire( void ) { SetThink( NULL ); SetMoveType( MOVETYPE_FLY ); SetModel("models/weapons/w_missile.mdl"); UTIL_SetSize( this, vec3_origin, vec3_origin ); EmitSound( "Weapon_Bazooka.Shoot" ); // Smoke trail. CreateSmokeTrail(); }
// When teleported (usually by portal) void CRocket_Turret_Projectile::NotifySystemEvent(CBaseEntity *pNotify, notify_system_event_t eventType, const notify_system_event_params_t ¶ms ) { // On teleport, we record a pointer to the portal we are arriving at if ( eventType == NOTIFY_EVENT_TELEPORT ) { // HACK: Clearing the owner allows collisions with launcher. // Players have had trouble realizing a launcher's own rockets don't kill it // because they didn't ever collide. We do this after a portal teleport so it avoids self-collisions on launch. SetOwnerEntity( NULL ); // Restart smoke trail UTIL_Remove( m_hRocketTrail ); m_hRocketTrail = NULL; // This shouldn't leak cause the pointer has been handed to the delete list CreateSmokeTrail(); } }
LTBOOL CProjectileFX::CreateObject(ILTClient* pClientDE) { if (!CSpecialFX::CreateObject(pClientDE) || !m_hServerObject) return LTFALSE; CGameSettings* pSettings = g_pInterfaceMgr->GetSettings(); if (!pSettings) return LTFALSE; uint8 nDetailLevel = pSettings->SpecialFXSetting(); LTVector vPos; LTRotation rRot; g_pLTClient->GetObjectPos(m_hServerObject, &vPos); g_pLTClient->GetObjectRotation(m_hServerObject, &rRot); //m_pClientDE->CPrint("Client start pos (%.2f, %.2f, %.2f)", vPos.x, vPos.y, vPos.z); //m_fStartTime = m_pClientDE->GetTime(); if (nDetailLevel != RS_LOW) { if (m_nFX & PFX_SMOKETRAIL) { CreateSmokeTrail(vPos, rRot); } if (m_nFX & PFX_LIGHT) { CreateLight(vPos, rRot); } } if (m_nFX & PFX_FLARE) { CreateFlare(vPos, rRot); } if (m_nFX & PFX_FLYSOUND) { CreateFlyingSound(vPos, rRot); } // Do client-side projectiles in multiplayer games... if ( g_pClientMultiplayerMgr->IsConnectedToRemoteServer( )) { // Set the velocity of the "server" object if it is really just a local // object... if (m_bLocal) { VEC_COPY(m_vFirePos, vPos); m_fStartTime = m_pClientDE->GetTime(); LTVector vVel, vF; vF = rRot.Forward(); m_vPath = vF; // Special case of adjusting the projectile speed... LTFLOAT fVel = (LTFLOAT) m_pProjectileFX->nVelocity; if (m_bAltFire) { fVel = (LTFLOAT) m_pProjectileFX->nAltVelocity; } LTFLOAT fMultiplier = 1.0f; if (m_pClientDE->GetSConValueFloat("MissileSpeed", fMultiplier) != LT_NOTFOUND) { fVel *= fMultiplier; } vVel = vF * fVel; g_pPhysicsLT->SetVelocity(m_hServerObject, &vVel); } } return LTTRUE; }
LTBOOL CProjectileFX::CreateObject(ILTClient* pClientDE) { if (!CSpecialFX::CreateObject(pClientDE) || !m_hServerObject) return LTFALSE; CGameSettings* pSettings = g_pInterfaceMgr->GetSettings(); if (!pSettings) return LTFALSE; uint8 nDetailLevel = pSettings->SpecialFXSetting(); LTVector vPos; LTRotation rRot; m_pClientDE->GetObjectPos(m_hServerObject, &vPos); m_pClientDE->GetObjectRotation(m_hServerObject, &rRot); if (nDetailLevel != RS_LOW) { if (m_nFX & PFX_SMOKETRAIL) { CreateSmokeTrail(vPos, rRot); } if (m_nFX & PFX_LIGHT) { CreateLight(vPos, rRot); } } if (m_nFX & PFX_FLARE) { CreateFlare(vPos, rRot); } if (m_nFX & PFX_FLYSOUND) { CreateFlyingSound(vPos, rRot); } // Do client-side projectiles in multiplayer games... if (g_pGameClientShell->IsMultiplayerGame()) { // Set the velocity of the "server" object if it is really just a local // object... if (m_bLocal) { VEC_COPY(m_vFirePos, vPos); m_fStartTime = m_pClientDE->GetTime(); LTVector vVel, vU, vR, vF; m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF); VEC_COPY(m_vPath, vF); // Special case of adjusting the projectile speed... LTFLOAT fVel = (LTFLOAT) m_pProjectileFX->nVelocity; if (m_bAltFire) { fVel = (LTFLOAT) m_pProjectileFX->nAltVelocity; } LTFLOAT fMultiplier = 1.0f; if (m_pClientDE->GetSConValueFloat("MissileSpeed", fMultiplier) != LT_NOTFOUND) { fVel *= fMultiplier; } VEC_MULSCALAR(vVel, vF, fVel); m_pClientDE->Physics()->SetVelocity(m_hServerObject, &vVel); } } return LTTRUE; }