void CLeech::RecalculateWaterlevel( void ) { // Calculate boundaries Vector vecTest = pev->origin - Vector(0,0,400); TraceResult tr; UTIL_TraceLine(pev->origin, vecTest, missile, edict(), &tr); if ( tr.flFraction != 1.0 ) m_bottom = tr.vecEndPos.z + 1; else m_bottom = vecTest.z; m_top = UTIL_WaterLevel( pev->origin, pev->origin.z, pev->origin.z + 400 ) - 1; // Chop off 20% of the outside range float newBottom = m_bottom * 0.8 + m_top * 0.2; m_top = m_bottom * 0.2 + m_top * 0.8; m_bottom = newBottom; m_height = RANDOM_FLOAT( m_bottom, m_top ); m_waterTime = gpGlobals->time + RANDOM_FLOAT( 5, 7 ); }
//========================================================= // LeapTouch - this is the headcrab's touch function when it // is in the air //========================================================= void CHeadCrab :: LeapTouch ( CBaseEntity *pOther ) { if ( !pOther->pev->takedamage ) { return; } if ( pOther->Classify() == Classify() ) { return; } // Don't hit if back on ground if ( !FBitSet( pev->flags, FL_ONGROUND ) ) { EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY(pBiteSounds), GetSoundVolue(), ATTN_IDLE, 0, GetVoicePitch() ); pOther->TakeDamage( pev, pev, GetDamageAmount(), DMG_SLASH ); } SetTouch( NULL ); }
//========================================================= // HandleAnimEvent - catches the monster-specific messages // that occur when tagged animation frames are played. //========================================================= void CHellKnight :: HandleAnimEvent( MonsterEvent_t *pEvent ) { switch( pEvent->event ) { case HKNIGHT_IDLE_SOUND: if( m_Activity == ACT_RUN ) CheckForCharge (); if( RANDOM_FLOAT( 0.0f, 1.0f ) < 0.1f ) EMIT_SOUND( edict(), CHAN_VOICE, "hknight/idle.wav", 1.0, ATTN_IDLE ); break; case HKNIGHT_SHOT_SPIKES: ShootSpike( atof( pEvent->options )); break; case HKNIGHT_MELEE_ATTACK: AI_Melee (); break; default: CQuakeMonster::HandleAnimEvent( pEvent ); break; } }
void CShambler :: ShamblerClaw( float side ) { if (m_hEnemy == NULL) return; AI_Charge(10); Vector delta = m_hEnemy->pev->origin - pev->origin; if (delta.Length() > 100) return; float ldmg = (RANDOM_FLOAT(0,1) + RANDOM_FLOAT(0,1) + RANDOM_FLOAT(0,1)) * 20; m_hEnemy->TakeDamage( pev, pev, ldmg, DMG_SLASH); EMIT_SOUND( edict(), CHAN_VOICE, "shambler/smack.wav", 1, ATTN_NORM); if (side) { UTIL_MakeVectors( pev->angles ); SpawnMeatSpray (pev->origin + gpGlobals->v_forward * 16, side * gpGlobals->v_right); } }
// // Gib bounces on the ground or wall, sponges some blood down, too! // void CGib :: BounceGibTouch ( CBaseEntity *pOther ) { Vector vecSpot; TraceResult tr; //if ( RANDOM_LONG(0,1) ) // return;// don't bleed everytime if (pev->flags & FL_ONGROUND) { pev->velocity = pev->velocity * 0.9; pev->angles.x = 0; pev->angles.z = 0; pev->avelocity.x = 0; pev->avelocity.z = 0; } else { if ( g_Language != LANGUAGE_GERMAN && m_cBloodDecals > 0 && m_bloodColor != DONT_BLEED ) { vecSpot = pev->origin + Vector ( 0 , 0 , 8 );//move up a bit, and trace down. UTIL_TraceLine ( vecSpot, vecSpot + Vector ( 0, 0, -24 ), ignore_monsters, ENT(pev), & tr); UTIL_BloodDecalTrace( &tr, m_bloodColor ); m_cBloodDecals--; } if ( m_material != matNone && RANDOM_LONG(0,2) == 0 ) { float volume; float zvel = fabs(pev->velocity.z); volume = 0.8 * min(1.0, ((float)zvel) / 450.0); CBreakable::MaterialSoundRandom( edict(), (Materials)m_material, volume ); } } }
void CGargantua :: FlameCreate( void ) { int i; Vector posGun, angleGun; TraceResult trace; UTIL_MakeVectors( GetAbsAngles() ); for ( i = 0; i < 4; i++ ) { if ( i < 2 ) m_pFlame[i] = CBeam::BeamCreate( GARG_BEAM_SPRITE_NAME, 240 ); else m_pFlame[i] = CBeam::BeamCreate( GARG_BEAM_SPRITE2, 140 ); if ( m_pFlame[i] ) { int attach = i%2; // attachment is 0 based in GetAttachment GetAttachment( attach+1, posGun, angleGun ); Vector vecEnd = (gpGlobals->v_forward * GARG_FLAME_LENGTH) + posGun; UTIL_TraceLine( posGun, vecEnd, dont_ignore_monsters, edict(), &trace ); m_pFlame[i]->PointEntInit( trace.vecEndPos, entindex() ); if ( i < 2 ) m_pFlame[i]->SetColor( 255, 130, 90 ); else m_pFlame[i]->SetColor( 0, 120, 255 ); m_pFlame[i]->SetBrightness( 190 ); m_pFlame[i]->SetBeamFlags( BEAM_FSHADEIN ); m_pFlame[i]->SetScrollRate( 20 ); // attachment is 1 based in SetEndAttachment m_pFlame[i]->SetEndAttachment( attach + 2 ); CSoundEnt::InsertSound( bits_SOUND_COMBAT, posGun, 384, 0.3 ); } } EMIT_SOUND_DYN ( this, CHAN_BODY, pBeamAttackSounds[ 1 ], 1.0, ATTN_NORM, 0, PITCH_NORM ); EMIT_SOUND_DYN ( this, CHAN_WEAPON, pBeamAttackSounds[ 2 ], 1.0, ATTN_NORM, 0, PITCH_NORM ); }
void CP90::Spawn() { Precache(); m_iId = WEAPON_P90; SET_MODEL(edict(), "models/w_p90.mdl"); m_iDefaultAmmo = P90_DEFAULT_GIVE; m_flAccuracy = 0.2f; m_iShotsFired = 0; m_bDelayFire = false; #ifdef REGAMEDLL_API CSPlayerWeapon()->m_flBaseDamage = P90_DAMAGE; #endif // Get ready to fall down FallInit(); // extend CBasePlayerWeapon::Spawn(); }
BOOL CWeaponBox::PackWeapon( CBasePlayerWeapon *pWeapon ) { // is one of these weapons already packed in this box? if ( HasWeapon( pWeapon ) ) return FALSE;// box can only hold one of each weapon type if ( pWeapon->m_pPlayer ) { // failed to unhook the weapon from the player! if ( !pWeapon->m_pPlayer->RemovePlayerItem( pWeapon ) ) return FALSE; } int iWeaponSlot = pWeapon->iItemSlot(); if ( m_rgpPlayerItems[ iWeaponSlot ] ) { // there's already one weapon in this slot, so link this into the slot's column pWeapon->m_pNext = m_rgpPlayerItems[ iWeaponSlot ]; m_rgpPlayerItems[ iWeaponSlot ] = pWeapon; } else { // first weapon we have for this slot m_rgpPlayerItems[ iWeaponSlot ] = pWeapon; pWeapon->m_pNext = NULL; } pWeapon->pev->spawnflags |= SF_NORESPAWN;// never respawn pWeapon->pev->movetype = MOVETYPE_NONE; pWeapon->pev->solid = SOLID_NOT; pWeapon->pev->effects = EF_NODRAW; pWeapon->pev->modelindex = 0; pWeapon->pev->model = iStringNull; pWeapon->pev->owner = edict(); pWeapon->SetThink( NULL );// crowbar may be trying to swing again, etc. pWeapon->SetTouch( NULL ); pWeapon->m_pPlayer = NULL; return TRUE; }
// // Causes the door to "do its thing", i.e. start moving, and cascade activation. // int CBaseDoor::DoorActivate( ) { if ( CHalfLifeRules *rules = dynamic_cast<CHalfLifeRules *>( g_pGameRules ) ) { if ( rules->EntityShouldBePrevented( edict() ) ) { return 0; } } if (!UTIL_IsMasterTriggered(m_sMaster, m_hActivator)) return 0; if (FBitSet(pev->spawnflags, SF_DOOR_NO_AUTO_RETURN) && m_toggle_state == TS_AT_TOP) {// door should close DoorGoDown(); } else {// door should open if ( m_hActivator != NULL && m_hActivator->IsPlayer() ) {// give health if player opened the door (medikit) // VARS( m_eoActivator )->health += m_bHealthValue; m_hActivator->TakeHealth( m_bHealthValue, DMG_GENERIC ); } // play door unlock sounds PlayLockSounds(pev, &m_ls, FALSE, FALSE); DoorGoUp(); } if ( CHalfLifeRules *singlePlayerRules = dynamic_cast< CHalfLifeRules * >( g_pGameRules ) ) { singlePlayerRules->HookModelIndex( this->edict() ); } return 1; }
void CZombie :: RunTask ( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_CHECK_FOR_NOBODY_AROUND: { CBaseEntity *pEnt = NULL; while (pEnt = UTIL_FindEntityInSphere(pEnt, pev->origin + Vector(0, 0, 20), 18)) { if (pEnt->edict() == edict()) continue; if (!pEnt->IsAlive()) continue; if (pEnt->pev->solid == SOLID_NOT || pEnt->pev->solid == SOLID_TRIGGER) continue; return; } TaskComplete(); } break; case TASK_AWAKE_FROM_DEAD: { if ( pev->frame >= 255 ) { ReSpawn(); TaskComplete(); } } break; default: CBaseMonster::RunTask(pTask); break; } }
void CApache :: FireRocket( void ) { static float side = 1.0; static int count; if (m_iRockets <= 0) return; UTIL_MakeAimVectors( pev->angles ); Vector vecSrc = pev->origin + 1.5 * (gpGlobals->v_forward * 21 + gpGlobals->v_right * 70 * side + gpGlobals->v_up * -79); switch( m_iRockets % 5) { case 0: vecSrc = vecSrc + gpGlobals->v_right * 10; break; case 1: vecSrc = vecSrc - gpGlobals->v_right * 10; break; case 2: vecSrc = vecSrc + gpGlobals->v_up * 10; break; case 3: vecSrc = vecSrc - gpGlobals->v_up * 10; break; case 4: break; } MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc ); WRITE_BYTE( TE_SMOKE ); WRITE_COORD( vecSrc.x ); WRITE_COORD( vecSrc.y ); WRITE_COORD( vecSrc.z ); WRITE_SHORT( g_sModelIndexSmoke ); WRITE_BYTE( 20 ); // scale * 10 WRITE_BYTE( 12 ); // framerate MESSAGE_END(); CBaseEntity *pRocket = CBaseEntity::Create( "hvr_rocket", vecSrc, pev->angles, edict() ); if (pRocket) pRocket->pev->velocity = pev->velocity + gpGlobals->v_forward * 100; m_iRockets--; side = - side; }
/* <24674f> ../cstrike/dlls/wpn_shared/wpn_c4.cpp:419 */ void CC4::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { if (m_pPlayer != NULL) { return; } CBasePlayer *pPlayer = reinterpret_cast<CBasePlayer *>(UTIL_PlayerByIndex(1)); if (pPlayer != NULL) { edict_t *m_pentOldCurBombTarget = pPlayer->m_pentCurBombTarget; pPlayer->m_pentCurBombTarget = NULL; if (pev->speed != 0 && g_pGameRules) { g_pGameRules->m_iC4Timer = (int)pev->speed; } EMIT_SOUND(edict(), CHAN_WEAPON, "weapons/c4_plant.wav", VOL_NORM, ATTN_NORM); CGrenade::ShootSatchelCharge(m_pPlayer->pev, m_pPlayer->pev->origin, Vector(0, 0, 0)); CGrenade *pC4 = NULL; while ((pC4 = (CGrenade *)UTIL_FindEntityByClassname(pC4, "grenade")) != NULL) { if (pC4->m_bIsC4 && pC4->m_flNextFreq == gpGlobals->time) { pC4->pev->target = pev->target; pC4->pev->noise1 = pev->noise1; break; } } pPlayer->m_pentCurBombTarget = m_pentOldCurBombTarget; SUB_Remove(); } }
void CFuncTankMortar::Fire( const Vector &barrelEnd, const Vector &forward, entvars_t *pevAttacker ) { if ( m_fireLast != 0 ) { int bulletCount = (gpGlobals->time - m_fireLast) * m_fireRate; // Only create 1 explosion if ( bulletCount > 0 ) { TraceResult tr; // TankTrace needs gpGlobals->v_up, etc. UTIL_MakeAimVectors(pev->angles); TankTrace( barrelEnd, forward, gTankSpread[m_spread], tr ); ExplosionCreate( tr.vecEndPos, pev->angles, edict(), pev->impulse, TRUE ); CFuncTank::Fire( barrelEnd, forward, pev ); } } else CFuncTank::Fire( barrelEnd, forward, pev ); }
void CXenTree :: Spawn( void ) { Precache(); SET_MODEL( ENT(pev), "models/tree.mdl" ); pev->movetype = MOVETYPE_NONE; pev->solid = SOLID_BBOX; pev->takedamage = DAMAGE_YES; UTIL_SetSize( pev, Vector(-30,-30,0), Vector(30,30,188)); SetActivity( ACT_IDLE ); pev->nextthink = gpGlobals->time + 0.1; pev->frame = RANDOM_FLOAT(0,255); pev->framerate = RANDOM_FLOAT( 0.7, 1.4 ); Vector triggerPosition; UTIL_MakeVectorsPrivate( pev->angles, triggerPosition, NULL, NULL ); triggerPosition = pev->origin + (triggerPosition * 64); // Create the trigger m_pTrigger = CXenTreeTrigger::TriggerCreate( edict(), triggerPosition ); UTIL_SetSize( m_pTrigger->pev, Vector( -24, -24, 0 ), Vector( 24, 24, 128 ) ); }
//------------------------------------------------------------------------------ // Purpose : // Input : // Output : //------------------------------------------------------------------------------ bool CAI_PlayerAlly::IsOkToCombatSpeak( void ) { // if not alive, certainly don't speak if ( !IsAlive() ) return false; // if someone else is talking, don't speak if ( !GetExpresser()->SemaphoreIsAvailable() ) return false; if ( m_spawnflags & SF_NPC_GAG ) return false; // Don't speak if playing a script. if ( m_NPCState == NPC_STATE_SCRIPT ) return false; // if player is not in pvs, don't speak if ( !UTIL_FindClientInPVS(edict()) ) return false; return true; }
void CHostage::AnnounceDeath(CBasePlayer *pAttacker) { ClientPrint(pAttacker->pev, HUD_PRINTCENTER, "#Killed_Hostage"); if (!(pAttacker->m_flDisplayHistory & DHF_HOSTAGE_KILLED)) { pAttacker->HintMessage("#Hint_lost_money"); pAttacker->m_flDisplayHistory |= DHF_HOSTAGE_KILLED; } if (!g_pGameRules->IsMultiplayer()) CHalfLifeTraining::HostageDied(); UTIL_LogPrintf("\"%s<%i><%s><%s>\" triggered \"Killed_A_Hostage\"\n", STRING(pAttacker->pev->netname), GETPLAYERUSERID(pAttacker->edict()), GETPLAYERAUTHID(pAttacker->edict()), GetTeam(pAttacker->m_iTeam)); MESSAGE_BEGIN(MSG_SPEC, SVC_DIRECTOR); WRITE_BYTE(9); WRITE_BYTE(DRC_CMD_EVENT); WRITE_SHORT(ENTINDEX(pAttacker->edict())); WRITE_SHORT(ENTINDEX(edict())); WRITE_LONG(15); MESSAGE_END(); }
void CTriggerCamera :: UpdatePlayerView( void ) { int flags = 0; if( m_hActivator == NULL || !m_hActivator->edict() || !( m_hActivator->pev->flags & FL_CLIENT )) { ALERT( at_error, "Camera: No Client!\n" ); return; } if( pev->spawnflags & SF_CAMERA_PLAYER_TAKECONTROL ) { int state; if( GetState() == STATE_ON ) state = TRUE; else state = FALSE; // freeze player ((CBasePlayer *)((CBaseEntity *)m_hActivator))->EnableControl( state ); } #if 1 if( GetState() == STATE_OFF ) flags |= CAMERA_ON; else flags = 0; CBaseEntity *pCamera = UTIL_FindEntityByTargetname( NULL, STRING( pev->netname )); if( pCamera && !pCamera->IsBSPModel( )) UTIL_SetView( m_hActivator, pCamera, flags ); else UTIL_SetView( m_hActivator, this, flags ); #else // enchanced engine SET_VIEW (see code in client\global\view.cpp) if( GetState() == STATE_OFF ) SET_VIEW( m_hActivator->edict(), edict() ); else SET_VIEW( m_hActivator->edict(), m_hActivator->edict() ); #endif }
void CFuncConveyor :: Spawn( void ) { pev->flags |= FL_WORLDBRUSH; pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; SET_MODEL( edict(), GetModel() ); if( !FBitSet( pev->spawnflags, SF_CONVEYOR_VISUAL )) SetBits( pev->flags, FL_CONVEYOR ); // is mapper forgot set angles? if( pev->movedir == g_vecZero ) pev->movedir = Vector( 1, 0, 0 ); // HACKHACK - This is to allow for some special effects if( FBitSet( pev->spawnflags, SF_CONVEYOR_NOTSOLID )) { pev->solid = SOLID_NOT; pev->skin = 0; // don't want the engine thinking we've got special contents on this brush } else { if( m_hParent ) m_pUserData = WorldPhysic->CreateKinematicBodyFromEntity( this ); else m_pUserData = WorldPhysic->CreateStaticBodyFromEntity( this ); } if( pev->speed == 0 ) pev->speed = 100; m_flMaxSpeed = pev->speed; // save initial speed if( FBitSet( pev->spawnflags, SF_CONVEYOR_STARTOFF )) UpdateSpeed( 0 ); else UpdateSpeed( m_flMaxSpeed ); }
void CApache :: Killed( entvars_t *pevAttacker, int iGib ) { pev->movetype = MOVETYPE_TOSS; pev->gravity = 0.3; STOP_SOUND( ENT(pev), CHAN_STATIC, "apache/ap_rotor2.wav" ); UTIL_SetSize( pev, Vector( -32, -32, -64), Vector( 32, 32, 0) ); SetThink( DyingThink ); SetTouch( CrashTouch ); pev->nextthink = gpGlobals->time + 0.1; pev->health = 0; pev->takedamage = DAMAGE_NO; if (pev->spawnflags & SF_NOWRECKAGE) { m_flNextRocket = gpGlobals->time + 4.0; } else { m_flNextRocket = gpGlobals->time + 15.0; } // modif de Julien if ( pev->spawnflags & SF_APACHE_LENSFLARE && m_bFlashLightOn == TRUE ) { m_bFlashLightOn = FALSE; MESSAGE_BEGIN( MSG_ALL, gmsgLensFlare, NULL ); WRITE_BYTE ( 0 ); // éteint WRITE_BYTE ( ENTINDEX ( edict() ) ); MESSAGE_END(); } }
void CXenTree :: HandleAnimEvent( MonsterEvent_t *pEvent ) { switch( pEvent->event ) { case TREE_AE_ATTACK: { CBaseEntity *pList[8]; BOOL sound = FALSE; int count = UTIL_EntitiesInBox( pList, 8, m_pTrigger->pev->absmin, m_pTrigger->pev->absmax, FL_MONSTER|FL_CLIENT ); Vector forward; UTIL_MakeVectorsPrivate( pev->angles, forward, NULL, NULL ); for ( int i = 0; i < count; i++ ) { if ( pList[i] != this ) { if ( pList[i]->pev->owner != edict() ) { sound = TRUE; pList[i]->TakeDamage( pev, pev, 25, DMG_CRUSH | DMG_SLASH ); pList[i]->pev->punchangle.x = 15; pList[i]->pev->velocity = pList[i]->pev->velocity + forward * 100; } } } if ( sound ) { EMIT_SOUND_ARRAY_DYN( CHAN_WEAPON, pAttackHitSounds ); } } return; } CActAnimating::HandleAnimEvent( pEvent ); }
void CSatchelCharge::SatchelSlide(CBaseEntity *pOther) { entvars_t *pevOther = pOther->pev; // don't hit the guy that launched this grenade if (pOther->edict() == pev->owner) return; pev->gravity = 1;// normal gravity now TraceResult tr; UTIL_TraceLine(pev->origin, pev->origin - Vector(0, 0, 10), ignore_monsters, edict(), &tr); if (tr.flFraction < 1.0) { // add a bit of static friction pev->velocity = pev->velocity * 0.95; pev->avelocity = pev->avelocity * 0.9; // play sliding sound, volume based on velocity } if (!(pev->flags & FL_ONGROUND) && pev->velocity.Length2D() > 10) { BounceSound(); } StudioFrameAdvance(); }
/* <7f49c> ../cstrike/dlls/explode.cpp:39 */ void CShower::__MAKE_VHOOK(Spawn)(void) { pev->velocity = RANDOM_FLOAT(200, 300) * pev->angles; pev->velocity.x += RANDOM_FLOAT(-100, 100); pev->velocity.y += RANDOM_FLOAT(-100, 100); if (pev->velocity.z >= 0) pev->velocity.z += 200; else pev->velocity.z -= 200; pev->movetype = MOVETYPE_BOUNCE; pev->gravity = 0.5f; pev->nextthink = gpGlobals->time + 0.1f; pev->solid = SOLID_NOT; // Need a model, just use the grenade, we don't draw it anyway SET_MODEL(edict(), "models/grenade.mdl"); UTIL_SetSize(pev, g_vecZero, g_vecZero); pev->effects |= EF_NODRAW; pev->speed = RANDOM_FLOAT(0.5, 1.5); pev->angles = g_vecZero; }
//========================================================= // Spawn //========================================================= void CGargantua :: Spawn() { Precache( ); 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; 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, pev->origin, 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; }
//========================================================= // Randomly decide what powerup to be void CDiscwarPowerup::ChoosePowerupThink(void) { int iPowerup = RANDOM_LONG(0, NUM_POWERUPS - 1); m_iPowerupType = (1 << iPowerup); SET_MODEL(ENT(pev), szPowerupModels[iPowerup]); pev->effects &= ~EF_NODRAW; SetTouch(&CDiscwarPowerup::PowerupTouch); // Start Animating pev->sequence = 0; pev->frame = 0; ResetSequenceInfo(); SetThink(&CDiscwarPowerup::AnimateThink); pev->nextthink = gpGlobals->time + 0.1; pev->rendermode = kRenderTransAdd; pev->renderamt = 150; // Play the powerup appear sound EMIT_SOUND_DYN(edict(), CHAN_STATIC, "pspawn.wav", 1.0, ATTN_NORM, 0, 98 + RANDOM_LONG(0, 3)); }
// Grenade launcher void CBasePlayer::W_FireGrenade(int iQuadSound) { PLAYBACK_EVENT_FULL(FEV_NOTHOST, edict(), m_usGrenade, 0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, iQuadSound, 0, 0, 0); if(gpGlobals->deathmatch != 4) *m_pCurrentAmmo -= 1; // Get initial velocity UTIL_MakeVectors(pev->v_angle); Vector vecVelocity; if(pev->v_angle.x) { vecVelocity = gpGlobals->v_forward * 600 + gpGlobals->v_up * 200 + RANDOM_FLOAT(-1, 1) * gpGlobals->v_right * 10 + RANDOM_FLOAT(-1, 1) * gpGlobals->v_up * 10; } else { vecVelocity = GetAutoaimVector(AUTOAIM_5DEGREES); vecVelocity = vecVelocity * 600; vecVelocity.z = 200; } // Create the grenade CQuakeRocket *pRocket = CQuakeRocket::CreateGrenade(pev->origin, vecVelocity, this); }
void CFuncLight :: Spawn( void ) { m_Material = matGlass; CBreakable::Spawn(); SET_MODEL( edict(), GetModel() ); // probably map compiler haven't func_light support if( m_iStyle <= 0 || m_iStyle >= 256 ) { if( GetTargetname()[0] ) ALERT( at_error, "%s with name %s has bad lightstyle %i. Disabled\n", GetClassname(), GetTargetname(), m_iStyle ); else ALERT( at_error, "%s [%i] has bad lightstyle %i. Disabled\n", GetClassname(), entindex(), m_iStyle ); m_iState = STATE_DEAD; // lamp is dead } if( FBitSet( pev->spawnflags, SF_LIGHT_START_ON )) Use( this, this, USE_ON, 0 ); else Use( this, this, USE_OFF, 0 ); if( pev->health <= 0 ) pev->takedamage = DAMAGE_NO; else pev->takedamage = DAMAGE_YES; }
//========================================================= // HandleAnimEvent - catches the monster-specific messages // that occur when tagged animation frames are played. //========================================================= void CSoldier :: HandleAnimEvent( MonsterEvent_t *pEvent ) { switch( pEvent->event ) { case ARMY_SHOOT: MonsterFire(); break; case ARMY_END_ATTACK: m_fInAttack = TRUE; m_fAttackFinished = TRUE; break; case ARMY_DROP_BACKPACK: ammo_shells = 5; CWeaponBox::DropBackpack( this, 0 ); break; case ARMY_IDLE_SOUND: if( RANDOM_FLOAT( 0.0f, 1.0f ) < 0.2f ) EMIT_SOUND( edict(), CHAN_VOICE, "soldier/idle.wav", 1.0, ATTN_IDLE ); break; default: CQuakeMonster::HandleAnimEvent( pEvent ); break; } }
void CHellKnight :: MonsterPain( CBaseEntity *pAttacker, float flDamage ) { if( pev->pain_finished > gpGlobals->time ) return; EMIT_SOUND( edict(), CHAN_VOICE, "hknight/pain1.wav", 1.0, ATTN_NORM ); if(( gpGlobals->time - pev->pain_finished ) > 5 ) { // allways go into pain frame if it has been a while m_iAIState = STATE_PAIN; SetActivity( ACT_BIG_FLINCH ); pev->pain_finished = gpGlobals->time + 1; return; } if( RANDOM_FLOAT( 0.0f, 30.0f ) > flDamage ) return; // didn't flinch m_iAIState = STATE_PAIN; SetActivity( ACT_BIG_FLINCH ); pev->pain_finished = gpGlobals->time + 1; }
/* <8efe4> ../cstrike/dlls/func_tank.cpp:488 */ void CFuncTank::TrackTarget(void) { TraceResult tr; edict_t *pPlayer = FIND_CLIENT_IN_PVS(edict()); BOOL updateTime = FALSE, lineOfSight; Vector angles, direction, targetPosition, barrelEnd; edict_t *pTarget = NULL; // Get a position to aim for if (m_pController != NULL) { // Tanks attempt to mirror the player's angles angles = m_pController->pev->v_angle; angles.x = 0 - angles.x; pev->nextthink = pev->ltime + 0.05; } else { if (IsActive()) pev->nextthink = pev->ltime + 0.1; else return; if (FNullEnt(pPlayer)) { if (IsActive()) { // Wait 2 secs pev->nextthink = pev->ltime + 2; } return; } pTarget = FindTarget(pPlayer); if (!pTarget) { return; } // Calculate angle needed to aim at target barrelEnd = BarrelPosition(); targetPosition = pTarget->v.origin + pTarget->v.view_ofs; float range = (targetPosition - barrelEnd).Length(); if (!InRange(range)) return; UTIL_TraceLine(barrelEnd, targetPosition, dont_ignore_monsters, edict(), &tr); lineOfSight = FALSE; // No line of sight, don't track if (tr.flFraction == 1.0f || tr.pHit == pTarget) { lineOfSight = TRUE; CBaseEntity *pInstance = CBaseEntity::Instance(pTarget); if (InRange(range) && pInstance && pInstance->IsAlive()) { updateTime = TRUE; m_sightOrigin = UpdateTargetPosition(pInstance); } } // Track sight origin // !!! I'm not sure what i changed direction = m_sightOrigin - pev->origin; //direction = m_sightOrigin - barrelEnd; angles = UTIL_VecToAngles(direction); // Calculate the additional rotation to point the end of the barrel at the target (not the gun's center) AdjustAnglesForBarrel(angles, direction.Length()); } angles.x = -angles.x; // Force the angles to be relative to the center position angles.y = m_yawCenter + UTIL_AngleDistance(angles.y, m_yawCenter); angles.x = m_pitchCenter + UTIL_AngleDistance(angles.x, m_pitchCenter); // Limit against range in y if (angles.y > m_yawCenter + m_yawRange) { angles.y = m_yawCenter + m_yawRange; // Don't update if you saw the player, but out of range updateTime = FALSE; } else if (angles.y < (m_yawCenter - m_yawRange)) { angles.y = (m_yawCenter - m_yawRange); // Don't update if you saw the player, but out of range updateTime = FALSE; } if (updateTime) { m_lastSightTime = gpGlobals->time; } // Move toward target at rate or less float_precision distY = UTIL_AngleDistance(angles.y, pev->angles.y); pev->avelocity.y = distY * 10; if (pev->avelocity.y > m_yawRate) { pev->avelocity.y = m_yawRate; } else if (pev->avelocity.y < -m_yawRate) { pev->avelocity.y = -m_yawRate; } // Limit against range in x if (angles.x > m_pitchCenter + m_pitchRange) { angles.x = m_pitchCenter + m_pitchRange; } else if (angles.x < m_pitchCenter - m_pitchRange) { angles.x = m_pitchCenter - m_pitchRange; } // Move toward target at rate or less float_precision distX = UTIL_AngleDistance(angles.x, pev->angles.x); pev->avelocity.x = distX * 10; if (pev->avelocity.x > m_pitchRate) { pev->avelocity.x = m_pitchRate; } else if (pev->avelocity.x < -m_pitchRate) { pev->avelocity.x = -m_pitchRate; } if (m_pController != NULL) { return; } if (CanFire() && ((fabs(distX) < m_pitchTolerance && fabs(distY) < m_yawTolerance) || (pev->spawnflags & SF_TANK_LINEOFSIGHT))) { BOOL fire = FALSE; Vector forward; UTIL_MakeVectorsPrivate(pev->angles, forward, NULL, NULL); if (pev->spawnflags & SF_TANK_LINEOFSIGHT) { float length = direction.Length(); UTIL_TraceLine(barrelEnd, barrelEnd + forward * length, dont_ignore_monsters, edict(), &tr); if (tr.pHit == pTarget) { fire = TRUE; } } else fire = TRUE; if (fire) { Fire(BarrelPosition(), forward, pev); } else m_fireLast = 0; } else m_fireLast = 0; }
void CRotDoor :: Spawn( void ) { // set the axis of rotation AxisDir( pev ); if( FBitSet( pev->spawnflags, SF_DOOR_PASSABLE )) pev->solid = SOLID_NOT; else pev->solid = SOLID_BSP; Precache(); // check for clockwise rotation if( FBitSet( pev->spawnflags, SF_DOOR_ROTATE_BACKWARDS )) pev->movedir = pev->movedir * -1; m_vecAngle1 = GetLocalAngles(); m_vecAngle2 = GetLocalAngles() + pev->movedir * m_flMoveDistance; ASSERTSZ( m_vecAngle1 != m_vecAngle2, "rotating door start/end positions are equal" ); pev->movetype = MOVETYPE_PUSH; SET_MODEL( edict(), GetModel() ); // NOTE: original Half-Life was contain a bug in AngularMove function // while m_flWait was equal 0 then object has stopped forever. See code from quake: /* void AngularMove( Vector vecDest, float flSpeed ) { ... ... ... if( flTravelTime < 0.1f ) { pev->avelocity = g_vecZero; pev->nextthink = pev->ltime + 0.1f; return; } } */ // this block was removed from Half-Life and there no difference // between wait = 0 and wait = -1. But in Xash this bug was fixed // and level-designer errors is now actual. I'm set m_flWait to -1 for compatibility if( m_flWait == 0.0f ) m_flWait = -1; if( pev->speed == 0 ) pev->speed = 100; // DOOR_START_OPEN is to allow an entity to be lighted in the closed position // but spawn in the open position if( FBitSet( pev->spawnflags, SF_DOOR_START_OPEN )) { // swap pos1 and pos2, put door at pos2, invert movement direction Vector vecNewAngles = m_vecAngle2; m_vecAngle2 = m_vecAngle1; m_vecAngle1 = vecNewAngles; pev->movedir = pev->movedir * -1; // We've already had our physics setup in BaseClass::Spawn, so teleport to our // current position. If we don't do this, our vphysics shadow will not update. Teleport( NULL, &m_vecAngle1, NULL ); } else { SetLocalAngles( m_vecAngle1 ); } m_iState = STATE_OFF; RelinkEntity(); m_pUserData = WorldPhysic->CreateKinematicBodyFromEntity( this ); if( FBitSet( pev->spawnflags, SF_DOOR_USE_ONLY )) { SetTouch( NULL ); } else { // touchable button SetTouch( DoorTouch ); } }