/* <8d4ad> ../cstrike/dlls/func_tank.cpp:656 */ void CFuncTank::__MAKE_VHOOK(Fire)(const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker) { if (m_fireLast != 0) { if (m_iszSpriteSmoke) { CSprite *pSprite = CSprite::SpriteCreate(STRING(m_iszSpriteSmoke), barrelEnd, TRUE); pSprite->AnimateAndDie(RANDOM_FLOAT(15, 20)); pSprite->SetTransparency(kRenderTransAlpha, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, 255, kRenderFxNone); pSprite->pev->velocity.z = RANDOM_FLOAT(40, 80); pSprite->SetScale(m_spriteScale); } if (m_iszSpriteFlash) { CSprite *pSprite = CSprite::SpriteCreate(STRING(m_iszSpriteFlash), barrelEnd, TRUE); pSprite->AnimateAndDie(60); pSprite->SetTransparency(kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation); pSprite->SetScale(m_spriteScale); // Hack Hack, make it stick around for at least 100 ms. pSprite->pev->nextthink += 0.1; } SUB_UseTargets(this, USE_TOGGLE, 0); } m_fireLast = gpGlobals->time; }
//--------------------------------------------------------- //--------------------------------------------------------- void CBounceBomb::UpdateLight( bool bTurnOn, unsigned int r, unsigned int g, unsigned int b, unsigned int a ) { if( bTurnOn ) { Assert( a > 0 ); // Throw the old sprite away if( m_hSprite ) { UTIL_Remove( m_hSprite ); m_hSprite.Set( NULL ); } if( !m_hSprite.Get() ) { Vector up; GetVectors( NULL, NULL, &up ); // Light isn't on. m_hSprite = CSprite::SpriteCreate( "sprites/glow01.vmt", GetAbsOrigin() + up * 10.0f, false ); CSprite *pSprite = (CSprite *)m_hSprite.Get(); if( m_hSprite ) { pSprite->SetParent( this ); pSprite->SetTransparency( kRenderTransAdd, r, g, b, a, kRenderFxNone ); pSprite->SetScale( 0.35, 0.0 ); } } else { // Update color CSprite *pSprite = (CSprite *)m_hSprite.Get(); pSprite->SetTransparency( kRenderTransAdd, r, g, b, a, kRenderFxNone ); } } if( !bTurnOn ) { if( m_hSprite ) { UTIL_Remove( m_hSprite ); m_hSprite.Set( NULL ); } } if ( !m_hSprite ) { m_LastSpriteColor.SetRawColor( 0 ); } else { m_LastSpriteColor.SetColor( r, g, b, a ); } }
void CNPC_ControllerHeadBall::Spawn( void ) { Precache( ); // motor SetMoveType( MOVETYPE_FLY ); SetSolid( SOLID_BBOX ); SetSize( vec3_origin, vec3_origin ); m_pSprite = CSprite::SpriteCreate( "sprites/xspark4.vmt", GetAbsOrigin(), FALSE ); m_pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); m_pSprite->SetAttachment( this, 0 ); m_pSprite->SetScale( 2.0 ); UTIL_SetSize( this, Vector( 0, 0, 0), Vector(0, 0, 0) ); UTIL_SetOrigin( this, GetAbsOrigin() ); SetThink( &CNPC_ControllerHeadBall::HuntThink ); SetTouch( &CNPC_ControllerHeadBall::BounceTouch ); // m_vecIdeal = vec3_origin; //(0,0,0) SetNextThink( gpGlobals->curtime + 0.1 ); m_hOwner = GetOwnerEntity(); m_flSpawnTime = gpGlobals->curtime; }
void CNPC_ControllerZapBall::Spawn( void ) { Precache( ); // motor SetMoveType( MOVETYPE_FLY ); // SetSolid( SOLID_CUSTOM ); SetSolid( SOLID_BBOX ); SetSize( vec3_origin, vec3_origin ); m_pSprite = CSprite::SpriteCreate( "sprites/xspark4.vmt", GetAbsOrigin(), FALSE ); m_pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); m_pSprite->SetAttachment( this, 0 ); m_pSprite->SetScale( 0.5 ); UTIL_SetSize( this, Vector( 0, 0, 0), Vector(0, 0, 0) ); UTIL_SetOrigin( this, GetAbsOrigin() ); SetThink( &CNPC_ControllerZapBall::AnimateThink ); SetTouch( &CNPC_ControllerZapBall::ExplodeTouch ); m_hOwner = GetOwnerEntity(); m_flSpawnTime = gpGlobals->curtime; // keep track of when ball spawned SetNextThink( gpGlobals->curtime + 0.1 ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCrossbow::DoLoadEffect( void ) { SetSkin( BOLT_SKIN_GLOW ); CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; CBaseViewModel *pViewModel = pOwner->GetViewModel(); if ( pViewModel == NULL ) return; CEffectData data; data.m_nEntIndex = pViewModel->entindex(); data.m_nAttachmentIndex = 1; DispatchEffect( "CrossbowLoad", data ); CSprite *pBlast = CSprite::SpriteCreate( CROSSBOW_GLOW_SPRITE2, GetAbsOrigin(), false ); if ( pBlast ) { pBlast->SetAttachment( pOwner->GetViewModel(), 1 ); pBlast->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNone ); pBlast->SetBrightness( 128 ); pBlast->SetScale( 0.2f ); pBlast->FadeOutFromSpawn(); } }
//========================================================= // Spawn //========================================================= void CGargantua :: Spawn() { Precache( ); if (pev->model) SET_MODEL(ENT(pev), STRING(pev->model)); //LRC else SET_MODEL(ENT(pev), "models/garg.mdl"); UTIL_SetSize( pev, Vector( -32, -32, 0 ), Vector( 32, 32, 64 ) ); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; m_bloodColor = BLOOD_COLOR_GREEN; if (!pev->health) pev->health = gSkillData.gargantuaHealth; //pev->view_ofs = Vector ( 0, 0, 96 );// taken from mdl file m_flFieldOfView = -0.2;// width of forward view cone ( as a dotproduct result ) m_MonsterState = MONSTERSTATE_NONE; MonsterInit(); m_pEyeGlow = CSprite::SpriteCreate( GARG_EYE_SPRITE_NAME, GetAbsOrigin(), FALSE ); m_pEyeGlow->SetTransparency( kRenderGlow, 255, 255, 255, 0, kRenderFxNoDissipation ); m_pEyeGlow->SetAttachment( edict(), 1 ); EyeOff(); m_seeTime = gpGlobals->time + 5; m_flameTime = gpGlobals->time + 2; }
void CSquidSpit::Shoot( CBaseEntity *pOwner, Vector vecStart, Vector vecVelocity ) { CSquidSpit *pSpit = CREATE_ENTITY( CSquidSpit, "squidspit" ); pSpit->Spawn(); UTIL_SetOrigin( pSpit, vecStart ); pSpit->SetAbsVelocity( vecVelocity ); pSpit->SetOwnerEntity( pOwner ); CSprite *pSprite = (CSprite*)pSpit->GetSprite(); if ( pSprite ) { pSprite->SetAttachment( pSpit, 0 ); pSprite->SetOwnerEntity( pSpit ); pSprite->SetScale( 0.5 ); pSprite->SetTransparency( pSpit->m_nRenderMode, pSpit->m_clrRender->r, pSpit->m_clrRender->g, pSpit->m_clrRender->b, pSpit->m_clrRender->a, pSpit->m_nRenderFX ); } CPVSFilter filter( vecStart ); VectorNormalize( vecVelocity ); te->SpriteSpray( filter, 0.0, &vecStart , &vecVelocity, pSpit->m_nSquidSpitSprite, 210, 25, 15 ); }
void CStomp::Think( void ) { trace_t tr; SetNextThink( gpGlobals->curtime + 0.1 ); // Do damage for this frame Vector vecStart = GetAbsOrigin(); vecStart.z += 30; Vector vecEnd = vecStart + (m_vecMoveDir * m_flSpeed * gpGlobals->frametime); UTIL_TraceHull( vecStart, vecEnd, Vector(-32, -32, -32), Vector(32, 32, 32), MASK_SOLID, m_pOwner, COLLISION_GROUP_NONE, &tr ); // NDebugOverlay::Line( vecStart, vecEnd, 0, 255, 0, false, 10.0f ); if ( tr.m_pEnt ) { CBaseEntity *pEntity = tr.m_pEnt; CTakeDamageInfo info( this, this, 50, DMG_SONIC ); CalculateMeleeDamageForce( &info, m_vecMoveDir, tr.endpos ); pEntity->TakeDamage( info ); } // Accelerate the effect m_flSpeed += (gpGlobals->frametime) * m_uiFramerate; m_uiFramerate += (gpGlobals->frametime) * 2000; // Move and spawn trails while ( gpGlobals->curtime - m_flDmgTime > STOMP_INTERVAL ) { SetAbsOrigin( GetAbsOrigin() + m_vecMoveDir * m_flSpeed * STOMP_INTERVAL ); for ( int i = 0; i < 2; i++ ) { CSprite *pSprite = CSprite::SpriteCreate( GARG_STOMP_SPRITE_NAME, GetAbsOrigin(), TRUE ); if ( pSprite ) { UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector(0,0,500), MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); pSprite->SetAbsOrigin( tr.endpos ); // pSprite->pev->velocity = Vector(RandomFloat(-200,200),RandomFloat(-200,200),175); pSprite->SetNextThink( gpGlobals->curtime + 0.3 ); pSprite->SetThink( &CSprite::SUB_Remove ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxFadeFast ); } g_pEffects->EnergySplash( tr.endpos, tr.plane.normal ); } m_flDmgTime += STOMP_INTERVAL; // Scale has the "life" of this effect m_flScale -= STOMP_INTERVAL * m_flSpeed; if ( m_flScale <= 0 ) { // Life has run out UTIL_Remove(this); // STOP_SOUND( edict(), CHAN_BODY, GARG_STOMP_BUZZ_SOUND ); CPASAttenuationFilter filter( this ); StopSound( entindex(), CHAN_STATIC, GARG_STOMP_BUZZ_SOUND ); } } }
void CStomp::Think( void ) { TraceResult tr; pev->nextthink = gpGlobals->time + 0.1; // Do damage for this frame Vector vecStart = GetAbsOrigin(); vecStart.z += 30; Vector vecEnd = vecStart + (pev->movedir * pev->speed * STOMP_FRAMETIME); UTIL_TraceHull( vecStart, vecEnd, dont_ignore_monsters, head_hull, ENT(pev), &tr ); if ( tr.pHit && tr.pHit != pev->owner ) { CBaseEntity *pEntity = CBaseEntity::Instance( tr.pHit ); entvars_t *pevOwner = pev; if ( pev->owner ) pevOwner = VARS(pev->owner); if ( pEntity ) pEntity->TakeDamage( pev, pevOwner, gSkillData.gargantuaDmgStomp, DMG_SONIC ); } // Accelerate the effect pev->speed = pev->speed + (STOMP_FRAMETIME) * pev->framerate; pev->framerate = pev->framerate + (STOMP_FRAMETIME) * 1500; // Move and spawn trails while ( gpGlobals->time - pev->dmgtime > STOMP_INTERVAL ) { SetAbsOrigin( GetAbsOrigin() + pev->movedir * pev->speed * STOMP_INTERVAL ); for ( int i = 0; i < 2; i++ ) { CSprite *pSprite = CSprite::SpriteCreate( GARG_STOMP_SPRITE_NAME, GetAbsOrigin(), TRUE ); if ( pSprite ) { UTIL_TraceLine( GetAbsOrigin(), GetAbsOrigin() - Vector( 0, 0, 500 ), ignore_monsters, edict(), &tr ); pSprite->SetAbsOrigin( tr.vecEndPos ); pSprite->SetAbsVelocity( Vector(RANDOM_FLOAT(-200,200),RANDOM_FLOAT(-200,200),175)); // pSprite->AnimateAndDie( RANDOM_FLOAT( 8.0, 12.0 ) ); pSprite->pev->nextthink = gpGlobals->time + 0.3; pSprite->SetThink( SUB_Remove ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxFadeFast ); } } pev->dmgtime += STOMP_INTERVAL; // Scale has the "life" of this effect pev->scale -= STOMP_INTERVAL * pev->speed; if ( pev->scale <= 0 ) { // Life has run out UTIL_Remove(this); STOP_SOUND( edict(), CHAN_BODY, GARG_STOMP_BUZZ_SOUND ); } } }
void CTank :: DeadThink ( void ) { pev->nextthink = gpGlobals->time + 0.1; pev->sequence = 0; // camera tournante pev->v_angle.y += 3; //rectification de la position de la camera vecCamAim = UpdateCam(); if ( m_pCam->pev->origin != vecCamAim ) m_pCam->pev->velocity = ( vecCamAim - m_pCam->pev->origin ) * 10; UpdateCamAngle ( vecCamAim, NEXTTHINK_TIME ); // sprites de feu for ( int i=0; i<4; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,25) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),140/*RANDOM_FLOAT(130,150)*/ ); } for ( i=0; i<1; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_SMOKEBALL, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_SMOKEBALL_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(3,4) ); pSpr->SetTransparency ( kRenderTransAlpha, 255, 255, 255, 200, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),RANDOM_FLOAT(130,150) ); } }
//----------------------------------------------------------------------------- // Purpose: Spawn the entity //----------------------------------------------------------------------------- void CNPC_CeilingTurret::Spawn( void ) { Precache(); SetModel( CEILING_TURRET_MODEL ); BaseClass::Spawn(); m_HackedGunPos = Vector( 0, 0, 12.75 ); SetViewOffset( EyeOffset( ACT_IDLE ) ); m_flFieldOfView = 0.0f; m_takedamage = DAMAGE_YES; m_iHealth = 1000; m_bloodColor = BLOOD_COLOR_MECH; SetSolid( SOLID_BBOX ); AddSolidFlags( FSOLID_NOT_STANDABLE ); SetHeight( CEILING_TURRET_RETRACT_HEIGHT ); AddFlag( FL_AIMTARGET ); AddEFlags( EFL_NO_DISSOLVE ); SetPoseParameter( m_poseAim_Yaw, 0 ); SetPoseParameter( m_poseAim_Pitch, 0 ); m_iAmmoType = GetAmmoDef()->Index( "AR2" ); //Create our eye sprite m_pEyeGlow = CSprite::SpriteCreate( CEILING_TURRET_GLOW_SPRITE, GetLocalOrigin(), false ); m_pEyeGlow->SetTransparency( kRenderTransAdd, 255, 0, 0, 128, kRenderFxNoDissipation ); m_pEyeGlow->SetAttachment( this, 2 ); //Set our autostart state m_bAutoStart = !!( m_spawnflags & SF_CEILING_TURRET_AUTOACTIVATE ); m_bEnabled = ( ( m_spawnflags & SF_CEILING_TURRET_STARTINACTIVE ) == false ); //Do we start active? if ( m_bAutoStart && m_bEnabled ) { SetThink( &CNPC_CeilingTurret::AutoSearchThink ); SetEyeState( TURRET_EYE_DORMANT ); } else { SetEyeState( TURRET_EYE_DISABLED ); } //Stagger our starting times SetNextThink( gpGlobals->curtime + random->RandomFloat( 0.1f, 0.3f ) ); // Don't allow us to skip animation setup because our attachments are critical to us! SetBoneCacheFlags( BCF_NO_ANIMATION_SKIP ); }
//----------------------------------------------------------------------------- // Purpose: Fire targets and spawn sprites. // Input : bulletCount - // barrelEnd - // forward - // pAttacker - //----------------------------------------------------------------------------- void CFuncTank::Fire( int bulletCount, const Vector &barrelEnd, const Vector &forward, CBaseEntity *pAttacker ) { if ( m_iszSpriteSmoke != NULL_STRING ) { CSprite *pSprite = CSprite::SpriteCreate( STRING(m_iszSpriteSmoke), barrelEnd, TRUE ); pSprite->AnimateAndDie( random->RandomFloat( 15.0, 20.0 ) ); pSprite->SetTransparency( kRenderTransAlpha, m_clrRender->r, m_clrRender->g, m_clrRender->b, 255, kRenderFxNone ); Vector vecVelocity( 0, 0, random->RandomFloat(40, 80) ); pSprite->SetAbsVelocity( vecVelocity ); pSprite->SetScale( m_spriteScale ); } if ( m_iszSpriteFlash != NULL_STRING ) { CSprite *pSprite = CSprite::SpriteCreate( STRING(m_iszSpriteFlash), barrelEnd, TRUE ); pSprite->AnimateAndDie( 60 ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); pSprite->SetScale( m_spriteScale ); } m_OnFire.FireOutput(this, this); }
// Fire targets and spawn sprites void CFuncTank::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker ) { if ( m_fireLast != 0 ) { if ( m_iszSpriteSmoke ) { CSprite *pSprite = CSprite::SpriteCreate( STRING(m_iszSpriteSmoke), barrelEnd, TRUE ); pSprite->AnimateAndDie( RANDOM_FLOAT( 15.0, 20.0 ) ); pSprite->SetTransparency( kRenderTransAlpha, static_cast<int>(pev->rendercolor.x), static_cast<int>(pev->rendercolor.y), static_cast<int>(pev->rendercolor.z), 255, kRenderFxNone ); pSprite->pev->velocity.z = RANDOM_FLOAT(40, 80); pSprite->SetScale( m_spriteScale ); } if ( m_iszSpriteFlash ) { CSprite *pSprite = CSprite::SpriteCreate( STRING(m_iszSpriteFlash), barrelEnd, TRUE ); pSprite->AnimateAndDie( 60 ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); pSprite->SetScale( m_spriteScale ); } SUB_UseTargets( this, USE_TOGGLE, 0 ); } m_fireLast = gpGlobals->time; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCrossbow::DoLoadEffect() { SetSkin(BOLT_SKIN_GLOW); CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( !pOwner ) return; CEffectData data; data.m_nAttachmentIndex = 1; #ifdef GAME_DLL data.m_nEntIndex = entindex(); CPASFilter filter(data.m_vOrigin); filter.RemoveRecipient(pOwner); te->DispatchEffect(filter, 0.0, data.m_vOrigin, "CrossbowLoad", data); #else CBaseViewModel *pViewModel = pOwner->GetViewModel(); if ( pViewModel != NULL ) { if ( ::input->CAM_IsThirdPerson() ) data.m_hEntity = pViewModel->GetRefEHandle(); else data.m_hEntity = GetRefEHandle(); DispatchEffect("CrossbowLoad", data); } #endif //Tony; switched this up, always attach it to the weapon, not the view model!! #ifndef CLIENT_DLL CSprite *pBlast = CSprite::SpriteCreate( CROSSBOW_GLOW_SPRITE2, GetAbsOrigin(), false ); if ( pBlast ) { pBlast->SetAttachment(this, 1); pBlast->SetTransparency(kRenderTransAdd, 255, 255, 255, 255, kRenderFxNone ); pBlast->SetBrightness(128); pBlast->SetScale(0.2f); pBlast->FadeOutFromSpawn(); } #endif }
void CXenPLight :: Spawn( void ) { Precache(); SET_MODEL( ENT(pev), "models/light.mdl" ); pev->movetype = MOVETYPE_NONE; pev->solid = SOLID_TRIGGER; UTIL_SetSize( pev, Vector(-80,-80,0), Vector(80,80,32)); SetActivity( ACT_IDLE ); pev->nextthink = gpGlobals->time + 0.1; pev->frame = RANDOM_FLOAT(0,255); m_pGlow = CSprite::SpriteCreate( XEN_PLANT_GLOW_SPRITE, pev->origin + Vector((float)0, (float)0, (float)((pev->mins.z+pev->maxs.z)*0.5)), FALSE ); m_pGlow->SetTransparency( kRenderGlow, pev->rendercolor.x, pev->rendercolor.y, pev->rendercolor.z, pev->renderamt, pev->renderfx ); m_pGlow->SetAttachment( edict(), 1 ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponCrossbow::DoLoadEffect( void ) { SetSkin( BOLT_SKIN_GLOW ); CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); if ( pOwner == NULL ) return; //Tony; change this up a bit; on the server, dispatch an effect but don't send it to the client who fires //on the client, create an effect either in the view model, or on the world model if first person. CEffectData data; data.m_nAttachmentIndex = 1; data.m_vOrigin = pOwner->GetAbsOrigin(); CPASFilter filter( data.m_vOrigin ); #ifdef GAME_DLL filter.RemoveRecipient( pOwner ); data.m_nEntIndex = entindex(); #else CBaseViewModel *pViewModel = pOwner->GetViewModel(); if ( ShouldDrawUsingViewModel() && pViewModel != NULL ) data.m_hEntity = pViewModel->GetRefEHandle(); else data.m_hEntity = GetRefEHandle(); #endif DispatchEffect( "CrossbowLoad", data, filter ); #ifndef CLIENT_DLL CSprite *pBlast = CSprite::SpriteCreate( CROSSBOW_GLOW_SPRITE2, GetAbsOrigin(), false ); if ( pBlast ) { pBlast->SetAttachment( this, 1 ); pBlast->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNone ); pBlast->SetBrightness( 128 ); pBlast->SetScale( 0.2f ); pBlast->FadeOutFromSpawn(); } #endif }
void CTFWeaponBaseGrenadeProj::RemoveGrenade( bool bBlinkOut ) { // Kill it SetThink( &BaseClass::SUB_Remove ); SetNextThink( gpGlobals->curtime ); SetTouch( NULL ); AddEffects( EF_NODRAW ); if ( bBlinkOut ) { // Sprite flash CSprite *pGlowSprite = CSprite::SpriteCreate( NOGRENADE_SPRITE, GetAbsOrigin(), false ); if ( pGlowSprite ) { pGlowSprite->SetTransparency( kRenderGlow, 255, 255, 255, 255, kRenderFxFadeFast ); pGlowSprite->SetThink( &CSprite::SUB_Remove ); pGlowSprite->SetNextThink( gpGlobals->curtime + 1.0 ); } } }
void CEgon::CreateEffect( void ) { DestroyEffect(); m_pBeam = CBeam::BeamCreate( EGON_BEAM_SPRITE, 40 ); m_pBeam->PointEntInit( pev->origin, m_pPlayer->edict() ); m_pBeam->SetFlags( FBEAM_SINENOISE ); m_pBeam->SetEndAttachment( 1 ); m_pBeam->pev->spawnflags |= SF_BEAM_TEMPORARY; // Flag these to be destroyed on save/restore or level transition m_pNoise = CBeam::BeamCreate( EGON_BEAM_SPRITE, 55 ); m_pNoise->PointEntInit( pev->origin, m_pPlayer->edict() ); m_pNoise->SetScrollRate( 25 ); m_pNoise->SetBrightness( 100 ); m_pNoise->SetEndAttachment( 1 ); m_pNoise->pev->spawnflags |= SF_BEAM_TEMPORARY; m_pSprite = CSprite::SpriteCreate( EGON_FLARE_SPRITE, pev->origin, FALSE ); m_pSprite->pev->scale = 1.0; m_pSprite->SetTransparency( kRenderGlow, 255, 255, 255, 255, kRenderFxNoDissipation ); m_pSprite->pev->spawnflags |= SF_SPRITE_TEMPORARY; if ( m_fireMode == FIRE_WIDE ) { m_pBeam->SetScrollRate( 50 ); m_pBeam->SetNoise( 20 ); m_pNoise->SetColor( 50, 50, 255 ); m_pNoise->SetNoise( 8 ); } else { m_pBeam->SetScrollRate( 110 ); m_pBeam->SetNoise( 5 ); m_pNoise->SetColor( 80, 120, 255 ); m_pNoise->SetNoise( 2 ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CShieldGrenade::Spawn( void ) { BaseClass::Spawn(); m_LastCollision.Init( 0, 0, 0 ); SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE ); SetSolid( SOLID_BBOX ); SetGravity( 1.0 ); SetFriction( 0.9 ); SetModel( "models/weapons/w_grenade.mdl"); UTIL_SetSize(this, Vector( -4, -4, -4), Vector(4, 4, 4)); m_IsEMPed = false; m_IsDeployed = false; m_flEMPDamageEndTime = 0.0f; SetTouch( StickyTouch ); SetCollisionGroup( TFCOLLISION_GROUP_GRENADE ); // Create a green light m_pLiveSprite = CSprite::SpriteCreate( "sprites/redglow1.vmt", GetLocalOrigin() + Vector(0,0,1), false ); m_pLiveSprite->SetTransparency( kRenderGlow, 0, 0, 255, 128, kRenderFxNoDissipation ); m_pLiveSprite->SetScale( 1 ); m_pLiveSprite->SetAttachment( this, 0 ); }
//----------------------------------------------------------------------------- // Purpose: Spawn the entity //----------------------------------------------------------------------------- void CNPC_CombineCamera::Spawn() { Precache(); SetModel(COMBINE_CAMERA_MODEL); m_pEyeFlash = CSprite::SpriteCreate(COMBINE_CAMERA_FLASH_SPRITE, GetLocalOrigin(), FALSE); m_pEyeFlash->SetTransparency(kRenderGlow, 255, 255, 255, 0, kRenderFxNoDissipation); m_pEyeFlash->SetAttachment(this, 2); m_pEyeFlash->SetBrightness(0); m_pEyeFlash->SetScale(1.0); BaseClass::Spawn(); m_HackedGunPos = Vector(0, 0, 12.75); SetViewOffset(EyeOffset(ACT_IDLE)); m_flFieldOfView = CAMERA_FOV_WIDE; m_takedamage = DAMAGE_YES; m_iHealth = 50; m_bloodColor = BLOOD_COLOR_MECH; SetSolid(SOLID_BBOX); AddSolidFlags(FSOLID_NOT_STANDABLE); SetHeight(COMBINE_CAMERA_RETRACT_HEIGHT); AddFlag(FL_AIMTARGET); SetPoseParameter(COMBINE_CAMERA_BC_YAW, 0); SetPoseParameter(COMBINE_CAMERA_BC_PITCH, 0); m_iAmmoType = GetAmmoDef()->Index("Pistol"); // Create our eye sprite m_pEyeGlow = CSprite::SpriteCreate(COMBINE_CAMERA_GLOW_SPRITE, GetLocalOrigin(), false); m_pEyeGlow->SetTransparency(kRenderWorldGlow, 255, 0, 0, 128, kRenderFxNoDissipation); m_pEyeGlow->SetAttachment(this, 2); // Set our enabled state m_bEnabled = ((m_spawnflags & SF_COMBINE_CAMERA_STARTINACTIVE) == false); // Make sure the radii are sane. if (m_nOuterRadius <= 0) { m_nOuterRadius = 300; } if (m_nInnerRadius <= 0) { m_nInnerRadius = 450; } if (m_nOuterRadius < m_nInnerRadius) { swap(m_nOuterRadius, m_nInnerRadius); } // Do we start active? if (m_bEnabled) { Deploy(); } else { SetEyeState(CAMERA_EYE_DISABLED); } //Adrian: No shadows on these guys. AddEffects( EF_NOSHADOW ); // Stagger our starting times SetNextThink( gpGlobals->curtime + random->RandomFloat(0.1f, 0.3f) ); // Don't allow us to skip animation setup because our attachments are critical to us! SetBoneCacheFlags( BCF_NO_ANIMATION_SKIP ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CNPC_AntlionGrub::Spawn( void ) { Precache(); SetModel( ANTLIONGRUB_MODEL ); m_NPCState = NPC_STATE_NONE; m_iHealth = sk_antliongrub_health.GetFloat(); m_iMaxHealth = m_iHealth; m_flFieldOfView = 0.5f; SetSolid( SOLID_BBOX ); SetMoveType( MOVETYPE_NONE ); SetCollisionGroup( COLLISION_GROUP_DEBRIS ); SetHullSizeNormal(); SetHullType( HULL_SMALL_CENTERED ); SetBloodColor( BLOOD_COLOR_YELLOW ); CapabilitiesClear(); m_flNextVoiceChange = gpGlobals->curtime; m_flSquashTime = gpGlobals->curtime; m_flNearTime = gpGlobals->curtime; m_flHealthTime = gpGlobals->curtime; m_flEnemyHostileTime = gpGlobals->curtime; m_bMoving = false; m_bSquashed = false; m_bSquashValid = false; m_bHealing = false; m_nHealthReserve = 10; SetTouch( GrubTouch ); // Attach to the surface under our belly AttachToSurface(); // Use detailed collision because we're an odd shape CollisionProp()->SetSurroundingBoundsType( USE_HITBOXES ); /* CSoundEnvelopeController &controller = CSoundEnvelopeController::GetController(); CPASAttenuationFilter filter( this ); m_pMovementSound = controller.SoundCreate( filter, entindex(), CHAN_BODY, "NPC_Antlion.Movement", 3.9f ); m_pVoiceSound = controller.SoundCreate( filter, entindex(), CHAN_VOICE, "NPC_Antlion.Voice", 3.9f ); m_pHealSound = controller.SoundCreate( filter, entindex(), CHAN_STATIC, "NPC_Antlion.Heal", 3.9f ); controller.Play( m_pMovementSound, 0.0f, 100 ); controller.Play( m_pVoiceSound, 0.0f, 100 ); controller.Play( m_pHealSound, 0.0f, 100 ); */ m_pGlowSprite = CSprite::SpriteCreate( "sprites/blueflare1.vmt", GetLocalOrigin(), false ); Assert( m_pGlowSprite ); if ( m_pGlowSprite == NULL ) return; Vector vecUp; GetVectors( NULL, NULL, &vecUp ); m_pGlowSprite->TurnOn(); m_pGlowSprite->SetTransparency( kRenderWorldGlow, 156, 169, 121, 164, kRenderFxNoDissipation ); m_pGlowSprite->SetAbsOrigin( GetAbsOrigin() + vecUp * 8.0f ); m_pGlowSprite->SetScale( 1.0f ); m_pGlowSprite->SetGlowProxySize( 16.0f ); // We don't want to teleport at this point AddSpawnFlags( SF_NPC_FALL_TO_GROUND ); // We get a bogus error otherwise NPCInit(); AddSolidFlags( FSOLID_TRIGGER ); }
void CTank :: TankDeath ( void ) { bTankDead = 1; pev->sequence = 2;/*LookupSequence( "die" );*/ ResetSequenceInfo (); m_pPlayer->TakeDamage ( pev,pev,(float)999, DMG_CRUSH ); // mouru pev->velocity = pev->avelocity = m_pTankBSP->pev->velocity = m_pTankBSP->pev->avelocity =Vector (0,0,0); m_pTankBSP->pev->origin = pev->origin; m_pTankBSP->pev->angles = pev->angles; m_pCam->pev->velocity = m_pCam->pev->avelocity = Vector (0,0,0); UpdateSound (); SetThink ( DeadThink ); pev->nextthink = gpGlobals->time + 29 / 21.0; // maman, c'est quoi qu'a fait boum ? EMIT_SOUND(ENT(pev), CHAN_AUTO, TANK_EXPLO_SOUND1, 1, ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_WEAPON, TANK_EXPLO_SOUND2, 1, ATTN_NORM); // sprites de feu - explosion for ( int i=0; i<20; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 50), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE*2 ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,22) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-150,150),RANDOM_FLOAT(-150,150),100/*RANDOM_FLOAT(130,150)*/ ); } // sprites de feu en colonne for ( i=0; i<6; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_FEU_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(20,25) ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 120, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),140/*RANDOM_FLOAT(130,150)*/ ); } for ( i=0; i<10; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_SMOKEBALL, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_SMOKEBALL_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(2,3) ); pSpr->SetTransparency ( kRenderTransAlpha, 255, 255, 255, 255, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),RANDOM_FLOAT(50,50) ); } // gibs for ( i = 0; i<20; i++ ) { CGib *pGib = GetClassPtr( (CGib *)NULL ); pGib->Spawn( "models/mechgibs.mdl" ); pGib->m_bloodColor = DONT_BLEED; pGib->pev->body = RANDOM_LONG (1,5); pGib->pev->origin = pev->origin + Vector ( 0, 0, 250 ); pGib->pev->velocity = Vector ( RANDOM_FLOAT(-200,200),RANDOM_FLOAT(-200,200),RANDOM_FLOAT(0,400)); pGib->pev->avelocity = Vector ( RANDOM_FLOAT(-1000,1000), RANDOM_FLOAT(-1000,1000), RANDOM_FLOAT(-1000,1000) ); pGib->pev->solid = SOLID_NOT; pGib->SetThink(SUB_Remove); pGib->pev->nextthink = gpGlobals->time + 1; } // étincelles for ( i = 0; i < 10; i++ ) { Create( "spark_shower", pev->origin, Vector (0,0,1), NULL ); } }
void CDisplacer::AltFireThink( void ) { #ifndef CLIENT_DLL m_iWorld = !m_iWorld; Vector vecSrc; CBaseEntity *pTarget = NULL; SendWeaponAnim ( DISPLACER_SPINUP ); SetThink ( NULL ); if ( g_pGameRules->IsMultiplayer() ) { // Randomize the destination in multiplayer for ( int i = RANDOM_LONG(1,5); i > 0; i-- ) pTarget = UTIL_FindEntityByClassname(pTarget, "info_player_deathmatch" ); } else { if (!m_iWorld) pTarget = UTIL_FindEntityByClassname(pTarget, "info_displacer_earth_target" ); else if (m_iWorld) pTarget = UTIL_FindEntityByClassname(pTarget, "info_displacer_xen_target" ); } if ( pTarget ) { Vector vecSrc = m_pPlayer->pev->origin; CDisplacerBall *pBall = CDisplacerBall::SelfCreate(); pBall->pev->owner = m_pPlayer->edict(); pBall->pev->origin = vecSrc; UTIL_ScreenFade( m_pPlayer, Vector(0, 160, 0), 0.5, 0.5, 255, FFADE_IN ); m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] -= DISPLACER_SECONDARY_USAGE; Vector tmp = pTarget->pev->origin; tmp.z -= m_pPlayer->pev->mins.z; tmp.z++; UTIL_SetOrigin( m_pPlayer->pev, tmp ); m_pPlayer->pev->angles = pTarget->pev->angles; m_pPlayer->pev->velocity = m_pPlayer->pev->basevelocity = g_vecZero; vecSrc = pTarget->pev->origin; MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); WRITE_BYTE(TE_DLIGHT); WRITE_COORD( vecSrc.x ); // X WRITE_COORD( vecSrc.y ); // Y WRITE_COORD( vecSrc.z ); // Z WRITE_BYTE( 24 ); // radius * 0.1 WRITE_BYTE( 255 ); // r WRITE_BYTE( 180 ); // g WRITE_BYTE( 96 ); // b WRITE_BYTE( 31.66 ); // time * 10 WRITE_BYTE( 1 ); // decay * 0.1 MESSAGE_END( ); CSprite *pSpr = CSprite::SpriteCreate( "sprites/xflare1.spr", vecSrc, TRUE ); pSpr->AnimateAndDie( 6 ); pSpr->SetTransparency(kRenderGlow, 128, 250, 214, 255, kRenderFxNoDissipation); EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/displacer_self.wav", 1.0, ATTN_NORM, 0, PITCH_NORM); } else { //ALERT( at_console, "Cannot find target %s\n", pTarget ); EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "buttons/button11.wav", 1.0, ATTN_NORM, 0, PITCH_NORM); } #endif m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; }
void CTank :: Fire ( int canon ) { Vector vecGun; GetAttachment( canon, vecGun, Vector(0,0,0) ); if ( !FStrEq(STRING(gpGlobals->mapname), "l3m10") && !FStrEq(STRING(gpGlobals->mapname), "l3m12") && !FStrEq(STRING(gpGlobals->mapname), "l3m14") ) { CSprite *pSprite = CSprite::SpriteCreate( SPRITE_SMOKE, vecGun, TRUE ); pSprite->AnimateAndDie( 15 ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); pSprite->SetAttachment( edict(), canon+1 ); pSprite->SetScale( SPRITE_SMOKE_SCALE ); } TraceResult tr; UTIL_MakeVectors ( TourelleAngle() ); UTIL_TraceLine( vecGun, vecGun + gpGlobals->v_forward * 8192, dont_ignore_monsters, edict(), &tr ); // pas de dommages - la fonction standart donne un rayon 2.5 fois les dommages // 250 * 2.5 = 625 - bcp trop grand ExplosionCreate( tr.vecEndPos, pev->angles, NULL/*edict()*/, 250, FALSE ); // on applique nous-même les dommages - rayon : 250 ::RadiusDamage( tr.vecEndPos, pev, pev, 300, 300, CLASS_NONE, DMG_BLAST ); //effet de fumée EnvSmokeCreate( tr.vecEndPos, 4, 10, 2, NULL ); /* // sprites de feu for ( int i=0; i<4; i++ ) { for ( int j=0; j<3; j++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_FEU, tr.vecEndPos + Vector(0,0,50), TRUE ); pSpr->SetTransparency ( kRenderTransAdd, 255, 255, 255, 180, kRenderFxNone ); pSpr->pev->scale = (float)((float)SPRITE_FEU_SCALE*2*(1/(i+1))); pSpr->pev->framerate = RANDOM_FLOAT(18,24); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50)*(3-i)/3,RANDOM_FLOAT(-50,50)*(3-i)/3, 50*(i)); pSpr->pev->spawnflags |= SF_SPRITE_ONCE; pSpr->TurnOn(); } } */ /* for ( i=0; i<1; i++ ) { CSprite *pSpr = CSprite::SpriteCreate ( SPRITE_SMOKEBALL, Vector(pev->origin.x,pev->origin.y,pev->origin.z + 100), TRUE ); pSpr->SetScale ( SPRITE_SMOKEBALL_SCALE ); pSpr->AnimateAndDie ( RANDOM_FLOAT(3,4) ); pSpr->SetTransparency ( kRenderTransAlpha, 255, 255, 255, 200, kRenderFxNone ); pSpr->pev->velocity = Vector ( RANDOM_FLOAT(-50,50),RANDOM_FLOAT(-50,50),RANDOM_FLOAT(130,150) ); } */ //breakable spéciaux if ( FClassnameIs (tr.pHit, "func_breakable") && VARS(tr.pHit)->spawnflags & SF_BREAK_TANKTOUCH ) { CBreakable *pBreak = (CBreakable*) CBaseEntity::Instance(tr.pHit); if ( pBreak->CheckTankPrev() ) { pBreak->pev->health = 0; pBreak->Killed( pev, GIB_NORMAL ); pBreak->Die(); } } }
void CTank :: DriveThink ( void ) { pev->nextthink = gpGlobals->time + NEXTTHINK_TIME; StudioFrameAdvance ( ); if ( pev->sequence == 1 ) pev->sequence = 0; // ALERT ( at_console, "playerdrivetank : %s\n", m_pPlayer->m_iDrivingTank == TRUE ? "TRUE" : "FALSE" ); // apres le changement de niveau, reinitialisation de la vue if ( bSetView == 1 ) { // actualisation de la vie du bsp m_pTankBSP->pev->health = m_flTempHealth; // réglages camera & hud m_pCam->SetPlayerTankView ( TRUE ); bSetView = 0; } //quitte le tank if (m_pPlayer->pev->button & IN_USE) { pev->velocity = pev->avelocity = m_pTankBSP->pev->velocity = m_pTankBSP->pev->avelocity =Vector (0,0,0); m_pTankBSP->pev->origin = pev->origin; m_pTankBSP->pev->angles = pev->angles; m_pCam->pev->velocity = ( vecCamOrigin() - m_pCam->pev->origin ) /2; UpdateCamAngle ( m_pCam->pev->origin, 2 ); UpdateSound (); SetThink( StopThink ); pev->nextthink = gpGlobals->time + 2; return; } float flNextVAngleY = pev->v_angle.y; float flNextVAngleX = pev->v_angle.x; float flNewAVelocity; Vector vecNewVelocity; //---------------------------------------------_-_-_ _ _ //modifications de la direction de la tourelle if ( bTankOn == 0 ) { bTankOn = 1; m_PlayerAngles.x = m_pPlayer->pev->angles.x ; m_PlayerAngles.y = m_pPlayer->pev->angles.y ; } if ( m_pPlayer->pev->angles.y != m_PlayerAngles.y ) { int iSens; int iDist = ModifAngles ( m_pPlayer->pev->angles.y ) - ModifAngles ( m_PlayerAngles.y ); if ( fabs(iDist) > 180 ) { if ( iDist > 0 ) iDist = iDist - 360; else iDist = iDist + 360; } iSens = iDist == fabs(iDist) ? 1 : -1 ; iDist = fabs(iDist); if ( iDist < TANK_TOURELLE_ROT_SPEED ) flNextVAngleY += iDist * iSens; else flNextVAngleY += TANK_TOURELLE_ROT_SPEED * iSens; if ( flNextVAngleY > TOURELLE_MAX_ROT_Y ) flNextVAngleY = TOURELLE_MAX_ROT_Y; if ( flNextVAngleY < -TOURELLE_MAX_ROT_Y ) flNextVAngleY = -TOURELLE_MAX_ROT_Y; } if ( m_pPlayer->pev->angles.x != m_PlayerAngles.x ) { int iSens; int iDist = ModifAngles ( m_pPlayer->pev->angles.x ) - ModifAngles ( m_PlayerAngles.x ); if ( fabs(iDist) > 180 ) { if ( iDist > 0 ) iDist = iDist - 360; else iDist = iDist + 360; } iSens = iDist == fabs(iDist) ? 1 : -1 ; iDist = fabs(iDist); if ( iDist < TANK_TOURELLE_ROT_SPEED ) flNextVAngleX += iDist * iSens; else flNextVAngleX += TANK_TOURELLE_ROT_SPEED * iSens; if ( flNextVAngleX > TOURELLE_MAX_ROT_X ) flNextVAngleX = TOURELLE_MAX_ROT_X; if ( flNextVAngleX < TOURELLE_MAX_ROT_X2 ) flNextVAngleX = TOURELLE_MAX_ROT_X2; } m_PlayerAngles.y = m_pPlayer->pev->angles.y; m_PlayerAngles.x = m_pPlayer->pev->angles.x; //--------------------------------- // sons d'acceleration du tank float flSpeed = pev->velocity.Length(); if ( m_flNextSound < gpGlobals->time) { if ( (m_pPlayer->pev->button & IN_FORWARD) && ((flSpeed==0) || (m_iTankmove & MOVE_BACKWARD)) ) { EMIT_SOUND_DYN(ENT(pev), CHAN_ITEM, ACCELERE_SOUND1, 1 , ATTN_NONE, 0, 100 ); m_flNextSound = gpGlobals->time + 2.5; } else if ( (m_pPlayer->pev->button & IN_BACK) && (m_iTankmove & MOVE_FORWARD) ) { EMIT_SOUND_DYN(ENT(pev), CHAN_ITEM, DECCELERE_SOUND, 1 , ATTN_NONE, 0, 100 ); m_flNextSound = gpGlobals->time + 2.5; } else if ( (m_pPlayer->pev->button & IN_FORWARD) && (m_iTankmove & MOVE_FORWARD) && !(m_iTankmove & PUSH_FORWARD)) { if ( RANDOM_LONG ( 0,1 ) ) EMIT_SOUND_DYN(ENT(pev), CHAN_ITEM, ACCELERE_SOUND2, 1 , ATTN_NONE, 0, 100 ); else EMIT_SOUND_DYN(ENT(pev), CHAN_ITEM, ACCELERE_SOUND3, 1 , ATTN_NONE, 0, 100 ); m_flNextSound = gpGlobals->time + 2.5; } } //------------------------------- //modification de la vitesse du tank UTIL_MakeVectors( pev->angles ); int iSens = UTIL_AngleDiff( UTIL_VecToAngles ( pev->velocity ).y, UTIL_VecToAngles ( gpGlobals->v_forward ).y ); if ( flSpeed == 0 ) iSens = 0; else if ( iSens < -45 || iSens > 45 ) iSens = -1; else iSens = 1; if ( m_pPlayer->pev->button & IN_FORWARD) { m_iTankmove |= PUSH_FORWARD; m_iTankmove &= ~PUSH_BACKWARD; if ( iSens == -1 ) { if ( flSpeed > TANK_DECCELERATION * 2 ) vecNewVelocity = gpGlobals->v_forward * - ( flSpeed - TANK_DECCELERATION ); else vecNewVelocity = Vector ( 0,0,0 ); } else if ( flSpeed < 250 ) vecNewVelocity = gpGlobals->v_forward * ( flSpeed + TANK_ACCELERATION ); else vecNewVelocity = gpGlobals->v_forward * 250; } else if ( m_pPlayer->pev->button & IN_BACK) { m_iTankmove |= PUSH_BACKWARD; m_iTankmove &= ~PUSH_FORWARD; if ( iSens == 1 ) { if ( flSpeed > TANK_DECCELERATION * 2 ) vecNewVelocity = gpGlobals->v_forward * ( flSpeed - TANK_DECCELERATION ); else vecNewVelocity = Vector ( 0,0,0 ); } else if ( flSpeed < 150 ) vecNewVelocity = gpGlobals->v_forward * - ( flSpeed + TANK_ACCELERATION ); else vecNewVelocity = gpGlobals->v_forward * -150; } else { if ( flSpeed > 5 ) vecNewVelocity = gpGlobals->v_forward * ( flSpeed - 1 ) * iSens; else vecNewVelocity = gpGlobals->v_forward * flSpeed * iSens; m_iTankmove &= ~PUSH_BACKWARD; m_iTankmove &= ~PUSH_FORWARD; } if ( iSens == 1) { m_iTankmove |= MOVE_FORWARD; m_iTankmove &= ~MOVE_BACKWARD; } else { m_iTankmove |= MOVE_BACKWARD; m_iTankmove &= ~MOVE_FORWARD; } //modification de la direction du tank if ( m_pPlayer->pev->button & IN_MOVELEFT ) flNewAVelocity = TANK_ROT_SPEED; else if ( m_pPlayer->pev->button & IN_MOVERIGHT ) flNewAVelocity = -TANK_ROT_SPEED; else flNewAVelocity = 0; // test de la position envisagée UTIL_MakeVectors ( pev->angles + Vector ( 0, flNewAVelocity / 10 , 0) ); TraceResult tr [4]/*1,tr2,tr3,tr4*/; Vector vecFrontLeft, vecFrontRight, vecBackLeft, vecBackRight; vecFrontLeft = NEW_ORIGIN + gpGlobals->v_forward * DIST_FRONT_UP + gpGlobals->v_right * -DIST_SIDE + gpGlobals->v_up * DIST_TOP; vecFrontRight = NEW_ORIGIN + gpGlobals->v_forward * DIST_FRONT_UP + gpGlobals->v_right * DIST_SIDE + gpGlobals->v_up * DIST_TOP; vecBackLeft = NEW_ORIGIN + gpGlobals->v_forward * DIST_BACK_UP + gpGlobals->v_right * -DIST_SIDE + gpGlobals->v_up * DIST_TOP; vecBackRight = NEW_ORIGIN + gpGlobals->v_forward * DIST_BACK_UP + gpGlobals->v_right * DIST_SIDE + gpGlobals->v_up * DIST_TOP; UTIL_TraceLine (vecFrontLeft, vecFrontRight,ignore_monsters, ENT(m_pTankBSP->pev), &tr[0]); UTIL_TraceLine (vecFrontRight, vecBackRight,ignore_monsters, ENT(m_pTankBSP->pev), &tr[1]); UTIL_TraceLine (vecBackRight, vecBackLeft, ignore_monsters, ENT(m_pTankBSP->pev), &tr[2]); UTIL_TraceLine (vecBackLeft, vecFrontLeft, ignore_monsters, ENT(m_pTankBSP->pev), &tr[3]); //pas de collision - application de la nouvelle position if ( tr[0].vecEndPos == vecFrontRight && tr[1].vecEndPos == vecBackRight && tr[2].vecEndPos == vecBackLeft && tr[3].vecEndPos == vecFrontLeft ) { StudioFrameAdvance ( 0.1 ); pev->velocity = vecNewVelocity; pev->avelocity = Vector ( 0, flNewAVelocity, 0 ); m_pCam->m_vecTourelleAngle = pev->v_angle; m_pCam->m_flNextFrameTime = pev->nextthink; pev->v_angle.y = flNextVAngleY; pev->v_angle.x = flNextVAngleX; m_pTankBSP->pev->velocity = (( pev->origin + vecNewVelocity * 10 ) - m_pTankBSP->pev-> origin ) / 10 ; m_pTankBSP->pev->avelocity = (( pev->angles + Vector ( 0, flNewAVelocity * 10, 0 ) - m_pTankBSP->pev->angles )) / 10; // pour combler la différence de vitesse entre le bsp et le mdl } //collision - arret du tank else { pev->velocity = pev->avelocity = Vector (0,0,0); m_pTankBSP->pev->velocity = ( pev->origin - m_pTankBSP->pev-> origin ) / 10 ; m_pTankBSP->pev->avelocity = ( pev->angles - m_pTankBSP->pev->angles ) / 10; if ( flSpeed > 50 ) // choc violent { EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, CHOC_SOUND, 0.9, ATTN_NORM, 0, 60 ); } } // application des dommages vecFrontLeft = vecFrontLeft + Vector ( 0, 0, 10 - DIST_TOP ); vecFrontRight = vecFrontRight + Vector ( 0, 0, 10 - DIST_TOP ); vecBackRight = vecBackRight + Vector ( 0, 0, 10 - DIST_TOP ); vecBackLeft = vecBackLeft + Vector ( 0, 0, 10 - DIST_TOP ); UTIL_TraceLine (vecFrontLeft, vecFrontRight,dont_ignore_monsters, ENT(m_pTankBSP->pev), &tr[0]); UTIL_TraceLine (vecFrontRight, vecBackRight,dont_ignore_monsters, ENT(m_pTankBSP->pev), &tr[1]); UTIL_TraceLine (vecBackRight, vecBackLeft, dont_ignore_monsters, ENT(m_pTankBSP->pev), &tr[2]); UTIL_TraceLine (vecBackLeft, vecFrontLeft, dont_ignore_monsters, ENT(m_pTankBSP->pev), &tr[3]); CBaseEntity *pEntity = NULL; for ( int i = 0 ; i < 4 ; i ++ ) { if ( tr [ i ].pHit != NULL ) { pEntity = CBaseEntity :: Instance ( tr [ i ].pHit ); if ( pEntity != NULL && pEntity->pev->takedamage ) { float fDamage; if ( FClassnameIs ( tr[i].pHit, "func_breakable" ) ) { fDamage = pEntity->pev->health; } else { fDamage = pev->velocity.Length() * 1.5 + 20; } pEntity->TakeDamage ( pev, pev , fDamage , DMG_CRUSH ); } } } //rectification de la position de la camera vecCamAim = UpdateCam(); if ( m_pCam->pev->origin != vecCamAim ) m_pCam->pev->velocity = ( vecCamAim - m_pCam->pev->origin ) * 10; UpdateCamAngle ( vecCamAim, NEXTTHINK_TIME ); //tir de la tourelle if ( ( m_pPlayer->pev->button & IN_ATTACK ) && ( gpGlobals->time > m_flLastAttack1 + TANK_REFIRE_DELAY ) ) { Fire ( bCanon ); bCanon = bCanon == TRUE ? FALSE : TRUE; EMIT_SOUND(ENT(pev), CHAN_AUTO, TIR_SOUND, 1, ATTN_NORM); m_flLastAttack1 = gpGlobals->time; m_pCam->pev->avelocity.x -= 45; } //tir de la mitrailleuse if ( m_pPlayer->pev->button & IN_ATTACK2 ) { Vector posGun, dirGun; GetAttachment( 3, posGun, Vector ( 0, 0, 0 ) ); UTIL_MakeVectorsPrivate( TourelleAngle(), dirGun, NULL, NULL ); FireBullets( 1, posGun, dirGun, VECTOR_CONE_5DEGREES, 8192, BULLET_MONSTER_12MM ); EMIT_SOUND(ENT(pev), CHAN_WEAPON, MITRAILLEUSE_SOUND, 1, ATTN_NORM); if ( !FStrEq(STRING(gpGlobals->mapname), "l3m10") && !FStrEq(STRING(gpGlobals->mapname), "l3m12") && !FStrEq(STRING(gpGlobals->mapname), "l3m14") ) { CSprite *pSprite = CSprite::SpriteCreate( SPRITE_MUZ, posGun, TRUE ); pSprite->AnimateAndDie( 15 ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); pSprite->SetAttachment( edict(), 4 ); pSprite->SetScale( SPRITE_MUZ_SCALE ); } } //sond du tank UpdateSound (); CSoundEnt::InsertSound ( bits_SOUND_DANGER, pev->origin + pev->velocity * 2.5, 150, NEXTTHINK_TIME ); CSoundEnt::InsertSound ( bits_SOUND_PLAYER, pev->origin, 2000, 0.5 ); }
void CDisc::DiscTouch ( CBaseEntity *pOther ) { // Push players backwards if ( pOther->IsPlayer() ) { if ( ((CBaseEntity*)m_hOwner) == pOther ) { if (m_fDontTouchOwner < gpGlobals->time) { // Play catch sound EMIT_SOUND_DYN( pOther->edict(), CHAN_WEAPON, "items/gunpickup2.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); ReturnToThrower(); } return; } else if ( m_fDontTouchEnemies < gpGlobals->time) { if ( pev->team != pOther->pev->team ) { ((CBasePlayer*)pOther)->m_LastHitGroup = HITGROUP_GENERIC; // Do freeze seperately so you can freeze and shatter a person with a single shot if ( m_iPowerupFlags & POW_FREEZE && ((CBasePlayer*)pOther)->m_iFrozen == FALSE ) { // Freeze the player and make them glow blue EMIT_SOUND_DYN( pOther->edict(), CHAN_WEAPON, "weapons/electro5.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); ((CBasePlayer*)pOther)->Freeze(); // If it's not a decap, return now. If it's a decap, continue to shatter if ( !m_bDecapitate ) { m_fDontTouchEnemies = gpGlobals->time + 2.0; return; } } // Decap or push if (m_bDecapitate) { // Decapitate! if ( m_bTeleported ) ((CBasePlayer*)pOther)->m_flLastDiscHitTeleport = gpGlobals->time; ((CBasePlayer*)pOther)->Decapitate( ((CBaseEntity*)m_hOwner)->pev ); m_fDontTouchEnemies = gpGlobals->time + 0.5; } else { // Play thwack sound switch( RANDOM_LONG(0,2) ) { case 0: EMIT_SOUND_DYN( pOther->edict(), CHAN_ITEM, "weapons/cbar_hitbod1.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); break; case 1: EMIT_SOUND_DYN( pOther->edict(), CHAN_ITEM, "weapons/cbar_hitbod2.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); break; case 2: EMIT_SOUND_DYN( pOther->edict(), CHAN_ITEM, "weapons/cbar_hitbod3.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); break; } // Push the player Vector vecDir = pev->velocity.Normalize(); pOther->pev->flags &= ~FL_ONGROUND; ((CBasePlayer*)pOther)->m_vecHitVelocity = vecDir * DISC_PUSH_MULTIPLIER; // Shield flash only if the player isnt frozen if ( ((CBasePlayer*)pOther)->m_iFrozen == false ) { pOther->pev->renderfx = kRenderFxGlowShell; pOther->pev->rendercolor.x = 255; pOther->pev->renderamt = 150; } ((CBasePlayer*)pOther)->m_hLastPlayerToHitMe = m_hOwner; ((CBasePlayer*)pOther)->m_flLastDiscHit = gpGlobals->time; ((CBasePlayer*)pOther)->m_iLastDiscBounces = m_iBounces; if ( m_bTeleported ) ((CBasePlayer*)pOther)->m_flLastDiscHitTeleport = gpGlobals->time; m_fDontTouchEnemies = gpGlobals->time + 2.0; } } } } // Hit a disc? else if ( pOther->pev->iuser4 ) { // Enemy Discs destroy each other if ( pOther->pev->iuser4 != pev->iuser4 ) { // Play a warp sound and sprite CSprite *pSprite = CSprite::SpriteCreate( "sprites/discreturn.spr", pev->origin, TRUE ); pSprite->AnimateAndDie( 60 ); pSprite->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); pSprite->SetScale( 1 ); EMIT_SOUND_DYN( edict(), CHAN_ITEM, "dischit.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); // Return both discs to their owners ((CDisc*)pOther)->ReturnToThrower(); ReturnToThrower(); } else { // Friendly discs just pass through each other } } else { m_iBounces++; switch ( RANDOM_LONG( 0, 1 ) ) { case 0: EMIT_SOUND_DYN( edict(), CHAN_ITEM, "weapons/xbow_hit1.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); break; case 1: EMIT_SOUND_DYN( edict(), CHAN_ITEM, "weapons/xbow_hit2.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0,3)); break; } UTIL_Sparks( pev->origin, edict() ); } }
void CNihilanth :: NextActivity( ) { UTIL_MakeAimVectors( pev->angles ); if (m_irritation >= 2) { if (m_pBall == NULL) { m_pBall = CSprite::SpriteCreate( "sprites/tele1.spr", pev->origin, TRUE ); if (m_pBall) { m_pBall->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation ); m_pBall->SetAttachment( edict(), 1 ); m_pBall->SetScale( 4.0 ); m_pBall->pev->framerate = 10.0; m_pBall->TurnOn( ); } } if (m_pBall) { MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); WRITE_BYTE( TE_ELIGHT ); WRITE_SHORT( entindex( ) + 0x1000 ); // entity, attachment WRITE_COORD( pev->origin.x ); // origin WRITE_COORD( pev->origin.y ); WRITE_COORD( pev->origin.z ); WRITE_COORD( 256 ); // radius WRITE_BYTE( 255 ); // R WRITE_BYTE( 192 ); // G WRITE_BYTE( 64 ); // B WRITE_BYTE( 200 ); // life * 10 WRITE_COORD( 0 ); // decay MESSAGE_END(); } } if ((pev->health < gSkillData.nihilanthHealth / 2 || m_iActiveSpheres < N_SPHERES / 2) && m_hRecharger == NULL && m_iLevel <= 9) { char szName[64]; CBaseEntity *pEnt = NULL; CBaseEntity *pRecharger = NULL; float flDist = 8192; sprintf(szName, "%s%d", m_szRechargerTarget, m_iLevel ); while ((pEnt = UTIL_FindEntityByTargetname( pEnt, szName )) != NULL) { float flLocal = (pEnt->pev->origin - pev->origin).Length(); if (flLocal < flDist) { flDist = flLocal; pRecharger = pEnt; } } if (pRecharger) { m_hRecharger = pRecharger; m_posDesired = Vector( pev->origin.x, pev->origin.y, pRecharger->pev->origin.z ); m_vecDesired = (pRecharger->pev->origin - m_posDesired).Normalize( ); m_vecDesired.z = 0; m_vecDesired = m_vecDesired.Normalize(); } else { m_hRecharger = NULL; ALERT( at_aiconsole, "nihilanth can't find %s\n", szName ); m_iLevel++; if (m_iLevel > 9) m_irritation = 2; } } float flDist = (m_posDesired - pev->origin).Length(); float flDot = DotProduct( m_vecDesired, gpGlobals->v_forward ); if (m_hRecharger != NULL) { // at we at power up yet? if (flDist < 128.0) { int iseq = LookupSequence( "recharge" ); if (iseq != pev->sequence) { char szText[64]; sprintf( szText, "%s%d", m_szDrawUse, m_iLevel ); FireTargets( szText, this, this, USE_ON, 1.0 ); ALERT( at_console, "fireing %s\n", szText ); } pev->sequence = LookupSequence( "recharge" ); } else { FloatSequence( ); } return; } if (m_hEnemy != NULL && !m_hEnemy->IsAlive()) { m_hEnemy = NULL; } if (m_flLastSeen + 15 < gpGlobals->time) { m_hEnemy = NULL; } if (m_hEnemy == NULL) { Look( 4096 ); m_hEnemy = BestVisibleEnemy( ); } if (m_hEnemy != NULL && m_irritation != 0) { if (m_flLastSeen + 5 > gpGlobals->time && flDist < 256 && flDot > 0) { if (m_irritation >= 2 && pev->health < gSkillData.nihilanthHealth / 2.0) { pev->sequence = LookupSequence( "attack1_open" ); } else { if (RANDOM_LONG(0, 1 ) == 0) { pev->sequence = LookupSequence( "attack1" ); // zap } else { char szText[64]; sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport ); CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText ); sprintf( szText, "%s%d", m_szTeleportUse, m_iTeleport ); CBaseEntity *pTrigger = UTIL_FindEntityByTargetname( NULL, szText ); if (pTrigger != NULL || pTouch != NULL) { pev->sequence = LookupSequence( "attack2" ); // teleport } else { m_iTeleport++; pev->sequence = LookupSequence( "attack1" ); // zap } } } return; } } FloatSequence( ); }