void CLeech::HandleAnimEvent(MonsterEvent_t *pEvent) { switch(pEvent->event) { case LEECH_AE_ATTACK: AttackSound(); CBaseEntity *pEnemy; pEnemy = m_hEnemy; if(pEnemy != NULL) { Vector dir, face; UTIL_MakeVectorsPrivate(pev->angles, face, NULL, NULL); face.z = 0; dir = (pEnemy->pev->origin - pev->origin); dir.z = 0; dir = dir.Normalize(); face = face.Normalize(); if(DotProduct(dir, face) > 0.9) // Only take damage if the leech is facing the prey pEnemy->TakeDamage(pev, pev, gSkillData.leechDmgBite, DMG_SLASH); } m_stateTime -= 2; break; case LEECH_AE_FLOP: // Play flop sound break; default: CBaseMonster::HandleAnimEvent(pEvent); break; } }
//========================================================= // Spawn //========================================================= void CIchthyosaur :: Spawn() { Precache( ); SET_MODEL(ENT(pev), "models/icky.mdl"); UTIL_SetSize( pev, Vector( -32, -32, -32 ), Vector( 32, 32, 32 ) ); pev->solid = SOLID_BBOX; pev->movetype = MOVETYPE_FLY; m_bloodColor = BLOOD_COLOR_GREEN; pev->health = gSkillData.ichthyosaurHealth; pev->view_ofs = Vector ( 0, 0, 16 ); m_flFieldOfView = VIEW_FIELD_WIDE; m_MonsterState = MONSTERSTATE_NONE; SetBits(pev->flags, FL_SWIM); SetFlyingSpeed( ICHTHYOSAUR_SPEED ); SetFlyingMomentum( 2.5 ); // Set momentum constant m_afCapability = bits_CAP_RANGE_ATTACK1 | bits_CAP_SWIM; MonsterInit(); SetTouch( BiteTouch ); SetUse( CombatUse ); m_idealDist = 384; m_flMinSpeed = 80; m_flMaxSpeed = 300; m_flMaxDist = 384; Vector Forward; UTIL_MakeVectorsPrivate(pev->angles, Forward, 0, 0); pev->velocity = m_flightSpeed * Forward.Normalize(); m_SaveVelocity = pev->velocity; }
void CHostage::MoveToward(Vector &vecLoc) { int nFwdMove; Vector vecFwd; Vector vecbigDest; Vector vecMove; CBaseEntity *pFollowing; Vector vecAng; float flDist; pFollowing = GetClassPtr((CBaseEntity *)m_hTargetEnt->pev); vecMove = vecLoc - pev->origin; vecAng = UTIL_VecToAngles(vecMove); vecAng = Vector(0, vecAng.y, 0); UTIL_MakeVectorsPrivate(vecAng, vecFwd, NULL, NULL); if ((vecFwd * m_LocalNav->s_flStepSize).Length2D() <= (vecLoc - pev->origin).Length2D()) flDist = (vecFwd * m_LocalNav->s_flStepSize).Length2D(); else flDist = (vecLoc - pev->origin).Length2D(); vecbigDest = pev->origin + (vecFwd * flDist); nFwdMove = m_LocalNav->PathTraversable(pev->origin, vecbigDest, FALSE); if (nFwdMove != TRAVERSABLE_NO) { vecbigDest = pFollowing->pev->origin; vecbigDest.z += pFollowing->pev->mins.z; if (FBitSet(pev->flags, FL_ONGROUND)) { flDist = (vecbigDest - pev->origin).Length(); if (flDist >= 110) { if (flDist >= 250) flDist = 400; else flDist = 300; } } else flDist = 250; pev->velocity.x = vecFwd.x * flDist; pev->velocity.y = vecFwd.y * flDist; UTIL_DrawBeamPoints(pev->origin, pev->origin + (pev->velocity.Normalize() * 500), 10, 255, 0, 0); if (nFwdMove != TRAVERSABLE_STEP && nFwdMove == TRAVERSABLE_STEPJUMPABLE) { if (FBitSet(pev->flags, FL_ONGROUND)) pev->velocity.z = 270; } } }
void NPC::MoveAction(void) { if ((g_waypoint->g_waypointPointFlag[m_currentWaypointIndex] & WAYPOINT_LADDER && GetDistance2D(pev->origin, g_waypoint->g_waypointPointOrigin[m_currentWaypointIndex]) <= 10.0f) || (m_oldNavIndex != -1 && g_waypoint->g_waypointPointFlag[m_oldNavIndex] & WAYPOINT_LADDER && GetDistance2D(pev->origin, g_waypoint->g_waypointPointOrigin[m_oldNavIndex]) <= 10.0f)) pev->movetype = MOVETYPE_FLY; else pev->movetype = MOVETYPE_PUSHSTEP; float oldSpeed = pev->speed; pev->speed = m_moveSpeed; if (m_moveSpeed == 0.0f || !IsAlive (GetEntity ())) { if (!IsOnLadder(GetEntity()) && pev->solid != SOLID_NOT) DROP_TO_FLOOR(GetEntity()); return; } if (IsOnLadder(GetEntity()) || pev->solid == SOLID_NOT) { pev->velocity = GetSpeedVector(pev->origin, m_destOrigin, pev->speed); if (pev->solid == SOLID_NOT) goto lastly; } else { Vector vecMove = m_destOrigin - pev->origin; Vector vecFwd, vecAng; VEC_TO_ANGLES(vecMove, vecAng); vecAng = Vector(0.0f, vecAng.y, 0.0f); UTIL_MakeVectorsPrivate(vecAng, vecFwd, null, null); pev->velocity.x = vecFwd.x * pev->speed; pev->velocity.y = vecFwd.y * pev->speed; } if (m_jumpAction) { pev->velocity.z = (270.0f * pev->gravity) + 32.0f; // client gravity 1 = 270.0f , and jump+duck + 32.0f m_jumpAction = false; } CheckStuck(oldSpeed); lastly: float speed = GetDistance2D(pev->velocity); if (speed > 10.0f || speed < -10.0f) g_npcAS |= ASC_MOVE; MakeVectors(pev->angles); }
void CGargantua::HandleAnimEvent(AnimEvent_t& event) { switch( event.event ) { case GARG_AE_SLASH_LEFT: { // HACKHACK!!! CBaseEntity *pHurt = GargantuaCheckTraceHullAttack( GARG_ATTACKDIST + 10.0, gSkillData.GetGargantuaDmgSlash(), DMG_SLASH ); if (pHurt) { if ( pHurt->GetFlags().Any( FL_MONSTER | FL_CLIENT ) ) { pHurt->SetPunchAngle( Vector( -30, // pitch -30, // yaw 30 //roll ) ); //UTIL_MakeVectors( GetAbsAngles() ); // called by CheckTraceHullAttack pHurt->SetAbsVelocity( pHurt->GetAbsVelocity() - gpGlobals->v_right * 100 ); } EMIT_SOUND_DYN ( this, CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 50 + RANDOM_LONG(0,15) ); } else // Play a random attack miss sound EMIT_SOUND_DYN ( this, CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 50 + RANDOM_LONG(0,15) ); Vector forward; UTIL_MakeVectorsPrivate( GetAbsAngles(), &forward, nullptr, nullptr ); } break; case GARG_AE_RIGHT_FOOT: case GARG_AE_LEFT_FOOT: UTIL_ScreenShake( GetAbsOrigin(), 4.0, 3.0, 1.0, 750 ); EMIT_SOUND_DYN ( this, CHAN_BODY, pFootSounds[ RANDOM_LONG(0,ARRAYSIZE(pFootSounds)-1) ], 1.0, ATTN_GARG, 0, PITCH_NORM + RANDOM_LONG(-10,10) ); break; case GARG_AE_STOMP: StompAttack(); m_seeTime = gpGlobals->time + 12; break; case GARG_AE_BREATHE: EMIT_SOUND_DYN ( this, CHAN_VOICE, pBreatheSounds[ RANDOM_LONG(0,ARRAYSIZE(pBreatheSounds)-1) ], 1.0, ATTN_GARG, 0, PITCH_NORM + RANDOM_LONG(-10,10) ); break; default: CBaseMonster::HandleAnimEvent( event ); break; } }
void CXenSporeLarge::Spawn( void ) { pev->skin = 2; CXenSpore::Spawn(); UTIL_SetSize( pev, Vector(-48,-48,110), Vector(48,48,240)); Vector forward, right; UTIL_MakeVectorsPrivate( pev->angles, forward, right, NULL ); // Rotate the leg hulls into position for ( int i = 0; i < ARRAYSIZE(m_hullSizes); i++ ) CXenHull :: CreateHull( this, Vector(-12, -12, 0 ), Vector( 12, 12, 120 ), (m_hullSizes[i].x * forward) + (m_hullSizes[i].y * right) ); }
//========================================================= // HandleAnimEvent - catches the monster-specific messages // that occur when tagged animation frames are played. //========================================================= void CMGargantua::HandleAnimEvent(MonsterEvent_t *pEvent) { switch( pEvent->event ) { case GARG_AE_SLASH_LEFT: { // HACKHACK!!! edict_t *pHurt = GargantuaCheckTraceHullAttack( GARG_ATTACKDIST + 10.0, gSkillData.gargantuaDmgSlash, DMG_SLASH ); if (pHurt) { if ( pHurt->v.flags & (FL_MONSTER|FL_CLIENT) ) { pHurt->v.punchangle.x = -30; // pitch pHurt->v.punchangle.y = -30; // yaw pHurt->v.punchangle.z = 30; // roll //UTIL_MakeVectors(pev->angles); // called by CheckTraceHullAttack pHurt->v.velocity = pHurt->v.velocity - gpGlobals->v_right * 100; } EMIT_SOUND_DYN ( edict(), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 50 + RANDOM_LONG(0,15) ); } else // Play a random attack miss sound EMIT_SOUND_DYN ( edict(), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 50 + RANDOM_LONG(0,15) ); Vector forward; UTIL_MakeVectorsPrivate( pev->angles, forward, NULL, NULL ); } break; case GARG_AE_RIGHT_FOOT: case GARG_AE_LEFT_FOOT: UTIL_ScreenShake( pev->origin, 4.0, 3.0, 1.0, 750 ); EMIT_SOUND_DYN ( edict(), CHAN_BODY, pFootSounds[ RANDOM_LONG(0,ARRAYSIZE(pFootSounds)-1) ], 1.0, ATTN_GARG, 0, PITCH_NORM + RANDOM_LONG(-10,10) ); break; case GARG_AE_STOMP: StompAttack(); m_seeTime = gpGlobals->time + 12; break; case GARG_AE_BREATHE: EMIT_SOUND_DYN ( edict(), CHAN_VOICE, pBreatheSounds[ RANDOM_LONG(0,ARRAYSIZE(pBreatheSounds)-1) ], 1.0, ATTN_GARG, 0, PITCH_NORM + RANDOM_LONG(-10,10) ); break; default: CMBaseMonster::HandleAnimEvent(pEvent); break; } }
static BOOL IsFacing( entvars_t *pevTest, const Vector &reference ) { Vector vecDir = (reference - pevTest->origin); vecDir.z = 0; vecDir = vecDir.Normalize(); Vector forward, angle; angle = pevTest->v_angle; angle.x = 0; UTIL_MakeVectorsPrivate( angle, forward, NULL, NULL ); // He's facing me, he meant it if ( DotProduct( forward, vecDir ) > 0.96 ) // +/- 15 degrees or so return TRUE; return FALSE; }
void UTIL_MergePos(CBaseEntity *pEnt, int loopbreaker) { if (loopbreaker <= 0)return; if (!pEnt->m_pMoveWith)return; Vector forward, right, up, vecOrg, vecAngles; UTIL_MakeVectorsPrivate(pEnt->m_pMoveWith->pev->angles, forward, right, up); if (pEnt->m_pMoveWith->pev->flags & FL_MONSTER) vecOrg = pEnt->m_vecPostAssistOrg = pEnt->m_pMoveWith->pev->origin + (forward * pEnt->m_vecOffsetOrigin.x) + (right * pEnt->m_vecOffsetOrigin.y) + (up * pEnt->m_vecOffsetOrigin.z); else vecOrg = pEnt->m_vecPostAssistOrg = pEnt->m_pMoveWith->pev->origin + (forward * pEnt->m_vecOffsetOrigin.x) + (-right * pEnt->m_vecOffsetOrigin.y) + (up * pEnt->m_vecOffsetOrigin.z); vecAngles = pEnt->m_vecPostAssistAng = pEnt->m_pMoveWith->pev->angles + pEnt->m_vecOffsetAngles; if (pEnt->m_pChildMoveWith) { CBaseEntity *pMoving = pEnt->m_pChildMoveWith; int sloopbreaker = MAX_MOVEWITH_DEPTH; while (pMoving) { UTIL_MergePos(pMoving, loopbreaker - 1); pMoving = pMoving->m_pSiblingMoveWith; sloopbreaker--; if (sloopbreaker <= 0)break; } } if (pEnt->m_iLFlags & LF_MERGEPOS) { UTIL_AssignOrigin(pEnt, vecOrg); UTIL_AssignAngles(pEnt, vecAngles); ClearBits(pEnt->m_iLFlags, LF_MERGEPOS); } if (pEnt->m_iLFlags & LF_POSTORG) { pEnt->pev->origin = vecOrg; pEnt->pev->angles = vecAngles; SetBits(pEnt->m_iLFlags, LF_DODESIRED); //refresh position every frame if (!pEnt->m_pAssistLink) UTIL_AddToAssistList(pEnt); } }
void CFuncTank::ControllerPostFrame(void) { ASSERT(m_pController != NULL); if (gpGlobals->time < m_flNextAttack) return; if (m_pController&&m_pController->pev->button & IN_ATTACK) { Vector vecForward; UTIL_MakeVectorsPrivate(pev->angles, vecForward, NULL, NULL); m_fireLast = gpGlobals->time - (1 / m_fireRate) - 0.01; Fire(BarrelPosition(), vecForward, m_pController->pev); if (m_pController && m_pController->IsPlayer()) ((CBasePlayer *)m_pController)->m_iWeaponVolume = LOUD_GUN_VOLUME; m_flNextAttack = gpGlobals->time + (1 / m_fireRate); } }
bool CLocalNav::LadderHit(Vector &vecSource, Vector &vecDest, TraceResult &tr) { Vector vecFwd, vecRight, vecUp; Vector vecAngles; Vector vecOrigin; vecAngles = UTIL_VecToAngles(-tr.vecPlaneNormal); UTIL_MakeVectorsPrivate(vecAngles, vecFwd, vecRight, vecUp); vecOrigin = tr.vecEndPos + (vecFwd * 15) + (vecUp * 36); if (UTIL_PointContents(vecOrigin) == CONTENTS_LADDER) return true; vecOrigin = tr.vecEndPos + (vecFwd * 15) - (vecUp * 36); if (UTIL_PointContents(vecOrigin) == CONTENTS_LADDER) return true; vecOrigin = tr.vecEndPos + (vecFwd * 15) + (vecRight * 16) + (vecUp * 36); if (UTIL_PointContents(vecOrigin) == CONTENTS_LADDER) return true; vecOrigin = tr.vecEndPos + (vecFwd * 15) - (vecRight * 16) + (vecUp * 36); if (UTIL_PointContents(vecOrigin) == CONTENTS_LADDER) return true; vecOrigin = tr.vecEndPos + (vecFwd * 15) + (vecRight * 16) - (vecUp * 36); if (UTIL_PointContents(vecOrigin) == CONTENTS_LADDER) return true; vecOrigin = tr.vecEndPos + (vecFwd * 15) - (vecRight * 16) + (vecUp * 36); if (UTIL_PointContents(vecOrigin) == CONTENTS_LADDER) return true; return false; }
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 ) ); }
// Called each frame by the player's ItemPostFrame void CFuncTank::ControllerPostFrame( void ) { ASSERT( m_pController != NULL ); if( gpGlobals->time < m_flNextAttack ) return; if( m_pController->pev->button & IN_ATTACK ) { Vector vecForward; UTIL_MakeVectorsPrivate( pev->angles, vecForward, NULL, NULL ); m_fireLast = gpGlobals->time - ( 1 / m_fireRate ) - 0.01; // to make sure the gun doesn't fire too many bullets Fire( BarrelPosition(), vecForward, m_pController->pev ); // HACKHACK -- make some noise (that the AI can hear) if( m_pController && m_pController->IsPlayer() ) ( ( CBasePlayer * ) m_pController )->m_iWeaponVolume = LOUD_GUN_VOLUME; m_flNextAttack = gpGlobals->time + ( 1 / m_fireRate ); } }
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 CLeech::HandleAnimEvent( AnimEvent_t& event ) { switch( event.event ) { case LEECH_AE_ATTACK: AttackSound(); CBaseEntity *pEnemy; pEnemy = m_hEnemy; if ( pEnemy != NULL ) { Vector dir, face; UTIL_MakeVectorsPrivate( pev->angles, &face, nullptr, nullptr ); face.z = 0; dir = (pEnemy->GetAbsOrigin() - GetAbsOrigin()); dir.z = 0; dir = dir.Normalize(); face = face.Normalize(); if ( DotProduct(dir, face) > 0.9 ) // Only take damage if the leech is facing the prey pEnemy->TakeDamage( this, this, gSkillData.GetLeechDmgBite(), DMG_SLASH ); } m_stateTime -= 2; break; case LEECH_AE_FLOP: // Play flop sound break; default: CBaseMonster::HandleAnimEvent( event ); break; } }
/* <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; }
//========================================================= // HandleAnimEvent - catches the monster-specific messages // that occur when tagged animation frames are played. // // Returns number of events handled, 0 if none. //========================================================= void CBigMomma :: HandleAnimEvent( MonsterEvent_t *pEvent ) { switch( pEvent->event ) { case BIG_AE_MELEE_ATTACKBR: case BIG_AE_MELEE_ATTACKBL: case BIG_AE_MELEE_ATTACK1: { Vector forward, right; UTIL_MakeVectorsPrivate( pev->angles, forward, right, NULL ); Vector center = pev->origin + forward * 128; Vector mins = center - Vector( 64, 64, 0 ); Vector maxs = center + Vector( 64, 64, 64 ); CBaseEntity *pList[8]; int count = UTIL_EntitiesInBox( pList, 8, mins, maxs, FL_MONSTER|FL_CLIENT ); CBaseEntity *pHurt = NULL; for ( int i = 0; i < count && !pHurt; i++ ) { if ( pList[i] != this ) { if ( pList[i]->pev->owner != edict() ) pHurt = pList[i]; } } if ( pHurt ) { pHurt->TakeDamage( pev, pev, gSkillData.bigmommaDmgSlash, DMG_CRUSH | DMG_SLASH ); pHurt->pev->punchangle.x = 15; switch( pEvent->event ) { case BIG_AE_MELEE_ATTACKBR: pHurt->pev->velocity = pHurt->pev->velocity + (forward * 150) + Vector(0,0,250) - (right * 200); break; case BIG_AE_MELEE_ATTACKBL: pHurt->pev->velocity = pHurt->pev->velocity + (forward * 150) + Vector(0,0,250) + (right * 200); break; case BIG_AE_MELEE_ATTACK1: pHurt->pev->velocity = pHurt->pev->velocity + (forward * 220) + Vector(0,0,200); break; } pHurt->pev->flags &= ~FL_ONGROUND; EMIT_SOUND_DYN( edict(), CHAN_WEAPON, RANDOM_SOUND_ARRAY(pAttackHitSounds), 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); } } break; case BIG_AE_SCREAM: EMIT_SOUND_ARRAY_DYN( CHAN_VOICE, pAlertSounds ); break; case BIG_AE_PAIN_SOUND: EMIT_SOUND_ARRAY_DYN( CHAN_VOICE, pPainSounds ); break; case BIG_AE_ATTACK_SOUND: EMIT_SOUND_ARRAY_DYN( CHAN_WEAPON, pAttackSounds ); break; case BIG_AE_BIRTH_SOUND: EMIT_SOUND_ARRAY_DYN( CHAN_BODY, pBirthSounds ); break; case BIG_AE_SACK: if ( RANDOM_LONG(0,100) < 30 ) EMIT_SOUND_ARRAY_DYN( CHAN_BODY, pSackSounds ); break; case BIG_AE_DEATHSOUND: EMIT_SOUND_ARRAY_DYN( CHAN_VOICE, pDeathSounds ); break; case BIG_AE_STEP1: // Footstep left case BIG_AE_STEP3: // Footstep back left EMIT_SOUND_ARRAY_DYN( CHAN_ITEM, pFootSounds ); break; case BIG_AE_STEP4: // Footstep back right case BIG_AE_STEP2: // Footstep right EMIT_SOUND_ARRAY_DYN( CHAN_BODY, pFootSounds ); break; case BIG_AE_MORTAR_ATTACK1: LaunchMortar(); break; case BIG_AE_LAY_CRAB: LayHeadcrab(); break; case BIG_AE_JUMP_FORWARD: ClearBits( pev->flags, FL_ONGROUND ); UTIL_SetOrigin (pev, pev->origin + Vector ( 0 , 0 , 1) );// take him off ground so engine doesn't instantly reset onground UTIL_MakeVectors ( pev->angles ); pev->velocity = (gpGlobals->v_forward * 200) + gpGlobals->v_up * 500; break; case BIG_AE_EARLY_TARGET: { CBaseEntity *pTarget = m_hTargetEnt; if ( pTarget && pTarget->pev->message ) FireTargets( STRING(pTarget->pev->message), this, this, USE_TOGGLE, 0 ); Remember( bits_MEMORY_FIRED_NODE ); } break; default: CBaseMonster::HandleAnimEvent( pEvent ); break; } }
void CTalkMonster :: StartTask( const Task_t& task ) { switch ( task.iTask ) { case TASK_TLK_SPEAK: // ask question or make statement FIdleSpeak(); TaskComplete(); break; case TASK_TLK_RESPOND: // respond to question IdleRespond(); TaskComplete(); break; case TASK_TLK_HELLO: // greet player FIdleHello(); TaskComplete(); break; case TASK_TLK_STARE: // let the player know I know he's staring at me. FIdleStare(); TaskComplete(); break; case TASK_FACE_PLAYER: case TASK_TLK_LOOK_AT_CLIENT: case TASK_TLK_CLIENT_STARE: // track head to the client for a while. m_flWaitFinished = gpGlobals->time + task.flData; break; case TASK_TLK_EYECONTACT: break; case TASK_TLK_IDEALYAW: if (m_hTalkTarget != NULL) { SetYawSpeed( 60 ); float yaw = VecToYaw(m_hTalkTarget->GetAbsOrigin() - GetAbsOrigin()) - GetAbsAngles().y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; if (yaw < 0) { SetIdealYaw( min( yaw + 45, 0.0f ) + GetAbsAngles().y ); } else { SetIdealYaw( max( yaw - 45, 0.0f ) + GetAbsAngles().y ); } } TaskComplete(); break; case TASK_TLK_HEADRESET: // reset head position after looking at something m_hTalkTarget = NULL; TaskComplete(); break; case TASK_TLK_STOPSHOOTING: // tell player to stop shooting PlaySentence( m_szGrp[TLK_NOSHOOT], RANDOM_FLOAT(2.8, 3.2), VOL_NORM, ATTN_NORM ); TaskComplete(); break; case TASK_CANT_FOLLOW: StopFollowing( false ); PlaySentence( m_szGrp[TLK_STOP], RANDOM_FLOAT(2, 2.5), VOL_NORM, ATTN_NORM ); TaskComplete(); break; case TASK_WALK_PATH_FOR_UNITS: m_movementActivity = ACT_WALK; break; case TASK_MOVE_AWAY_PATH: { Vector dir = GetAbsAngles(); dir.y = GetIdealYaw() + 180; Vector move; UTIL_MakeVectorsPrivate( dir, &move, nullptr, nullptr ); dir = GetAbsOrigin() + move * task.flData; if ( MoveToLocation( ACT_WALK, 2, dir ) ) { TaskComplete(); } else if ( FindCover( GetAbsOrigin(), GetViewOffset(), 0, CoverRadius() ) ) { // then try for plain ole cover m_flMoveWaitFinished = gpGlobals->time + 2; TaskComplete(); } else { // nowhere to go? TaskFail(); } } break; case TASK_PLAY_SCRIPT: m_hTalkTarget = NULL; CBaseMonster::StartTask( task ); break; default: CBaseMonster::StartTask( task ); } }
void CIchthyosaur::Swim( ) { int retValue = 0; Vector start = pev->origin; Vector Angles; Vector Forward, Right, Up; if (FBitSet( pev->flags, FL_ONGROUND)) { pev->angles.x = 0; pev->angles.y += RANDOM_FLOAT( -45, 45 ); ClearBits( pev->flags, FL_ONGROUND ); Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z ); UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); pev->velocity = Forward * 200 + Up * 200; return; } if (m_bOnAttack && m_flightSpeed < m_flMaxSpeed) { m_flightSpeed += 40; } if (m_flightSpeed < 180) { if (m_IdealActivity == ACT_RUN) SetActivity( ACT_WALK ); if (m_IdealActivity == ACT_WALK) pev->framerate = m_flightSpeed / 150.0; // ALERT( at_console, "walk %.2f\n", pev->framerate ); } else { if (m_IdealActivity == ACT_WALK) SetActivity( ACT_RUN ); if (m_IdealActivity == ACT_RUN) pev->framerate = m_flightSpeed / 150.0; // ALERT( at_console, "run %.2f\n", pev->framerate ); } /* if (!m_pBeam) { m_pBeam = CBeam::BeamCreate( "sprites/laserbeam.spr", 80 ); m_pBeam->PointEntInit( pev->origin + m_SaveVelocity, entindex( ) ); m_pBeam->SetEndAttachment( 1 ); m_pBeam->SetColor( 255, 180, 96 ); m_pBeam->SetBrightness( 192 ); } */ #define PROBE_LENGTH 150 Angles = UTIL_VecToAngles( m_SaveVelocity ); Angles.x = -Angles.x; UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); Vector f, u, l, r, d; f = DoProbe(start + PROBE_LENGTH * Forward); r = DoProbe(start + PROBE_LENGTH/3 * Forward+Right); l = DoProbe(start + PROBE_LENGTH/3 * Forward-Right); u = DoProbe(start + PROBE_LENGTH/3 * Forward+Up); d = DoProbe(start + PROBE_LENGTH/3 * Forward-Up); Vector SteeringVector = f+r+l+u+d; m_SaveVelocity = (m_SaveVelocity + SteeringVector/2).Normalize(); Angles = Vector( -pev->angles.x, pev->angles.y, pev->angles.z ); UTIL_MakeVectorsPrivate(Angles, Forward, Right, Up); // ALERT( at_console, "%f : %f\n", Angles.x, Forward.z ); float flDot = DotProduct( Forward, m_SaveVelocity ); if (flDot > 0.5) pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed; else if (flDot > 0) pev->velocity = m_SaveVelocity = m_SaveVelocity * m_flightSpeed * (flDot + 0.5); else pev->velocity = m_SaveVelocity = m_SaveVelocity * 80; // ALERT( at_console, "%.0f %.0f\n", m_flightSpeed, pev->velocity.Length() ); // ALERT( at_console, "Steer %f %f %f\n", SteeringVector.x, SteeringVector.y, SteeringVector.z ); /* m_pBeam->SetStartPos( pev->origin + pev->velocity ); m_pBeam->RelinkBeam( ); */ // ALERT( at_console, "speed %f\n", m_flightSpeed ); Angles = UTIL_VecToAngles( m_SaveVelocity ); // Smooth Pitch // if (Angles.x > 180) Angles.x = Angles.x - 360; pev->angles.x = UTIL_Approach(Angles.x, pev->angles.x, 50 * 0.1 ); if (pev->angles.x < -80) pev->angles.x = -80; if (pev->angles.x > 80) pev->angles.x = 80; // Smooth Yaw and generate Roll // float turn = 360; // ALERT( at_console, "Y %.0f %.0f\n", Angles.y, pev->angles.y ); if (fabs(Angles.y - pev->angles.y) < fabs(turn)) { turn = Angles.y - pev->angles.y; } if (fabs(Angles.y - pev->angles.y + 360) < fabs(turn)) { turn = Angles.y - pev->angles.y + 360; } if (fabs(Angles.y - pev->angles.y - 360) < fabs(turn)) { turn = Angles.y - pev->angles.y - 360; } float speed = m_flightSpeed * 0.1; // ALERT( at_console, "speed %.0f %f\n", turn, speed ); if (fabs(turn) > speed) { if (turn < 0.0) { turn = -speed; } else { turn = speed; } } pev->angles.y += turn; pev->angles.z -= turn; pev->angles.y = fmod((pev->angles.y + 360.0), 360.0); static float yaw_adj; yaw_adj = yaw_adj * 0.8 + turn; // ALERT( at_console, "yaw %f : %f\n", turn, yaw_adj ); SetBoneController( 0, -yaw_adj / 4.0 ); // Roll Smoothing // turn = 360; if (fabs(Angles.z - pev->angles.z) < fabs(turn)) { turn = Angles.z - pev->angles.z; } if (fabs(Angles.z - pev->angles.z + 360) < fabs(turn)) { turn = Angles.z - pev->angles.z + 360; } if (fabs(Angles.z - pev->angles.z - 360) < fabs(turn)) { turn = Angles.z - pev->angles.z - 360; } speed = m_flightSpeed/2 * 0.1; if (fabs(turn) < speed) { pev->angles.z += turn; } else { if (turn < 0.0) { pev->angles.z -= speed; } else { pev->angles.z += speed; } } if (pev->angles.z < -20) pev->angles.z = -20; if (pev->angles.z > 20) pev->angles.z = 20; UTIL_MakeVectorsPrivate( Vector( -Angles.x, Angles.y, Angles.z ), Forward, Right, Up); // UTIL_MoveToOrigin ( ENT(pev), pev->origin + Forward * speed, speed, MOVE_STRAFE ); }
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 CMTalkMonster :: StartTask( Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_TLK_SPEAK: // ask question or make statement FIdleSpeak(); TaskComplete(); break; case TASK_TLK_RESPOND: // respond to question IdleRespond(); TaskComplete(); break; case TASK_TLK_HELLO: // greet player FIdleHello(); TaskComplete(); break; case TASK_TLK_STARE: // let the player know I know he's staring at me. FIdleStare(); TaskComplete(); break; case TASK_FACE_PLAYER: case TASK_TLK_LOOK_AT_CLIENT: case TASK_TLK_CLIENT_STARE: // track head to the client for a while. m_flWaitFinished = gpGlobals->time + pTask->flData; break; case TASK_TLK_EYECONTACT: break; case TASK_TLK_IDEALYAW: if (m_hTalkTarget != NULL) { pev->yaw_speed = 60; float yaw = VecToYaw(m_hTalkTarget->v.origin - pev->origin) - pev->angles.y; if (yaw > 180) yaw -= 360; if (yaw < -180) yaw += 360; if (yaw < 0) { pev->ideal_yaw = min( yaw + 45.0f, 0.0f ) + pev->angles.y; } else { pev->ideal_yaw = max( yaw - 45.0f, 0.0f ) + pev->angles.y; } } TaskComplete(); break; case TASK_TLK_HEADRESET: // reset head position after looking at something m_hTalkTarget = NULL; TaskComplete(); break; case TASK_TLK_STOPSHOOTING: // tell player to stop shooting PlaySentence( m_szGrp[TLK_NOSHOOT], RANDOM_FLOAT(2.8, 3.2), VOL_NORM, ATTN_NORM ); TaskComplete(); break; case TASK_CANT_FOLLOW: StopFollowing( FALSE ); PlaySentence( m_szGrp[TLK_STOP], RANDOM_FLOAT(2, 2.5), VOL_NORM, ATTN_NORM ); TaskComplete(); break; case TASK_WALK_PATH_FOR_UNITS: m_movementActivity = ACT_WALK; break; case TASK_MOVE_AWAY_PATH: { Vector dir = pev->angles; dir.y = pev->ideal_yaw + 180; Vector move; UTIL_MakeVectorsPrivate( dir, move, NULL, NULL ); dir = pev->origin + move * pTask->flData; if ( MoveToLocation( ACT_WALK, 2, dir ) ) { TaskComplete(); } else if ( FindCover( pev->origin, pev->view_ofs, 0, CoverRadius() ) ) { // then try for plain ole cover m_flMoveWaitFinished = gpGlobals->time + 2; TaskComplete(); } else { // nowhere to go? TaskFail(); } } break; case TASK_PLAY_SCRIPT: m_hTalkTarget = NULL; CMBaseMonster::StartTask( pTask ); break; default: CMBaseMonster::StartTask( pTask ); } }
Vector BarrelPosition(void) { Vector forward, right, up; UTIL_MakeVectorsPrivate(pev->angles, forward, right, up); return pev->origin + (forward * m_barrelPos.x) + (right * m_barrelPos.y) + (up * m_barrelPos.z); }
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; if (m_pController) { angles = m_pController->pev->v_angle; angles[0] = 0 - angles[0]; pev->nextthink = pev->ltime + 0.05; } else { if (IsActive()) pev->nextthink = pev->ltime + 0.1; else return; if (FNullEnt(pPlayer)) { if (IsActive()) pev->nextthink = pev->ltime + 2; return; } pTarget = FindTarget(pPlayer); if (!pTarget) return; 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; if (tr.flFraction == 1 || tr.pHit == pTarget) { lineOfSight = TRUE; CBaseEntity *pInstance = CBaseEntity::Instance(pTarget); if (InRange(range) && pInstance && pInstance->IsAlive()) { updateTime = TRUE; m_sightOrigin = UpdateTargetPosition(pInstance); } } direction = m_sightOrigin - pev->origin; angles = UTIL_VecToAngles(direction); AdjustAnglesForBarrel(angles, direction.Length()); } angles.x = -angles.x; angles.y = m_yawCenter + UTIL_AngleDistance(angles.y, m_yawCenter); angles.x = m_pitchCenter + UTIL_AngleDistance(angles.x, m_pitchCenter); if (angles.y > m_yawCenter + m_yawRange) { angles.y = m_yawCenter + m_yawRange; updateTime = FALSE; } else if (angles.y < (m_yawCenter - m_yawRange)) { angles.y = (m_yawCenter - m_yawRange); updateTime = FALSE; } if (updateTime) m_lastSightTime = gpGlobals->time; float 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; 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; float 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) 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 CFuncMachinegun::PostFrame( CBasePlayer *pActivator ) { Vector plAngles = pActivator->pev->angles; while (plAngles.y < 0) plAngles.y += 360; float yawAngle = plAngles.y - pev->angles.y; float pitchAngle = pActivator->pev->angles.x * -3; SetBoneController( 0, yawAngle ); SetBoneController( 1, pitchAngle ); StudioFrameAdvance(); // return to idle after fire anim if (m_fSequenceFinished) { pev->sequence = TURRET_IDLE; pev->frame = 0; ResetSequenceInfo(); m_fSequenceLoops = TRUE; } if ( gpGlobals->time < m_flNextAttack ) return; if ( pActivator->pev->button & IN_ATTACK && (m_iAmmo > 0 || m_iAmmo == -1)) { // fire Vector vecForward, vecSrc, vecAngles; vecAngles = pActivator->pev->angles; vecAngles.x = vecAngles.x * -3; // invert anf scale pitch UTIL_MakeVectorsPrivate( vecAngles, vecForward, NULL, NULL ); GetAttachment(0, vecSrc, vecAngles); pev->sequence = TURRET_SHOOT_SOLID; // sounds, muzzleflashes, and shells will go by anim event pev->frame = 0; ResetSequenceInfo(); m_fSequenceLoops = FALSE; switch( m_projectileType ) { default: case TANK_BULLET_9MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_6DEGREES, 16384, BULLET_9MM, pActivator->pev); break; case TANK_BULLET_12MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_6DEGREES, 16384, BULLET_12MM, pActivator->pev); break; case TANK_BULLET_14MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_7DEGREES, 16384, BULLET_14MM, pActivator->pev); break; case TANK_BULLET_BUCKSHOT: for ( i = 0; i < 8; i++ ) FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_10DEGREES, 16384, BULLET_BUCKSHOT, pActivator->pev); break; case TANK_BULLET_12G: for ( i = 0; i < 4; i++ ) FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_15DEGREES, 16384, BULLET_12G, pActivator->pev); break; case TANK_BULLET_57MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_2DEGREES, 16384, BULLET_57mm, pActivator->pev); break; case TANK_BULLET_762NATO: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_3DEGREES, 16384, BULLET_762Nato, pActivator->pev); break; case TANK_BULLET_338MAGNUM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_338Magnum, pActivator->pev); break; case TANK_BULLET_762X54: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_4DEGREES, 16384, BULLET_762x54, pActivator->pev); break; case TANK_BULLET_86MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_8DEGREES, 16384, BULLET_86mm, pActivator->pev); break; case TANK_BULLET_32MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_5DEGREES, 16384, BULLET_32mm, pActivator->pev); break; case TANK_BULLET_127MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_1DEGREES, 16384, BULLET_127MM, pActivator->pev); break; case TANK_BULLET_BFG: for ( i = 0; i < 8; i++ ) FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_40DEGREES, 16384, BULLET_BFG, pActivator->pev); break; case TANK_BULLET_NAIL: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_NAILGUN, pActivator->pev); break; case TANK_BULLET_BOLT: CBolt::ShootBolt(pActivator->pev, vecSrc + vecForward*16, vecForward * 5000, 0 ); break; case TANK_ENERGY_HOMINGSHOCK: CShock::ShootShock(pActivator->pev, vecSrc + vecForward*16, vecForward * 400, FALSE ); break; case TANK_ENERGY_SHOCK: CShock::ShootShock(pActivator->pev, vecSrc + vecForward*16, vecForward * 700, TRUE ); break; case TANK_ENERGY_PLASMA: CPlasma::ShootPlasma(pActivator->pev, vecSrc + vecForward*16, vecForward * 20000 ); break; case TANK_ENERGY_PLASMALARGE: CPlasma2::ShootPlasma2(pActivator->pev, vecSrc + vecForward*16, vecForward * 20000 ); break; case TANK_ENERGY_FLAME: CFlame::ShootFlame(pActivator->pev, vecSrc + vecForward*16, vecForward * 900 ); break; case TANK_ENERGY_ECHARGE: CEnergycharge::ShootEnergycharge(pActivator->pev, vecSrc + vecForward*16, vecForward * 8000); break; case TANK_ENERGY_FROSTBALL: CFrostball::ShootFrostball(pActivator->pev, vecSrc + vecForward*16, vecForward * 5000); break; case TANK_ENERGY_GLUON: CGluon::ShootGluon(pActivator->pev, vecSrc + vecForward*16, vecForward * 2500 ); break; case TANK_ENERGY_GLUONLARGE: CGluon2::ShootGluon2(pActivator->pev, vecSrc + vecForward*16, vecForward * 6800, 10); break; case TANK_ENERGY_DISPBALL_HALF: CDispball::ShootDispball(pActivator->pev, vecSrc + vecForward*16, vecForward * 3000, 1); break; case TANK_ENERGY_DISPBALL_FULL: CDispball::ShootDispball(pActivator->pev, vecSrc + vecForward*16, vecForward * 1500, 2); break; case TANK_ENERGY_PBOLT: CPBolt::ShootPBolt(pActivator->pev, vecSrc + vecForward*16, vecForward * 15000 ); break; case TANK_ROCKET_XBOLT: CBolt::ShootBolt(pActivator->pev, vecSrc + vecForward*16, vecForward * 7500, 2); break; case TANK_ROCKET_CLUSTER: CClMomma::ShootClusterMomma(pActivator->pev, vecSrc + vecForward*16, vecForward * 1250, 3 ); break; case TANK_ROCKET_M203GREN: CM203grenade::ShootM203grenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 1800); break; case TANK_ROCKET_AK74GREN: CAK74grenade::ShootAK74grenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 4000); break; case TANK_ROCKET_HANDGREN: CGrenade::ShootGrenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 1500, 3.5); break; case TANK_ROCKET_NGGREN: CNGgrenade::ShootNGgrenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 2000, 3 ); break; case TANK_ROCKET_U2: CU2Momma::ShootU2Momma(pActivator->pev, vecSrc + vecForward*16, vecForward * 900, 1 ); break; case TANK_ROCKET_TESLAGREN: CTeslagren::ShootTeslagren(pActivator->pev, vecSrc + vecForward*16, vecForward * 3000); break; case TANK_ROCKET_MMISSILE: CMmissile::ShootMmissile(pActivator->pev, vecSrc + vecForward*16, vecForward * 5250 ); break; case TANK_ROCKET_DEMOLITION: CWhlProjectile::ShootWhlProjectile(pActivator->pev, vecSrc + vecForward*16, vecForward * 2250, FALSE ); break; case TANK_ROCKET_RPG: CRpgRocket::ShootRpgRocket(pActivator->pev, vecSrc + vecForward*16, vecForward * 2500, FALSE, NULL); break; case TANK_ROCKET_DUMBFIRE: CDumbfire::ShootDumbfire(pActivator->pev, vecSrc + vecForward*16, vecForward * 250); break; case TANK_ROCKET_HELLFIRE: Chellfire::ShootHellfire(pActivator->pev, vecSrc + vecForward*16, vecForward * 300, TRUE); break; case TANK_MORTAR: CTankProj::ShootTankProj(pActivator->pev, vecSrc + vecForward*16, vecForward * 100000); break; case TANK_ROCKET_NUKE: CNuke::ShootNuke(pActivator->pev, vecSrc + vecForward*16, vecForward * 1500, FALSE); break; case TANK_ROCKET_NUKE_CONTROLLED: CNuke::ShootNuke(pActivator->pev, vecSrc + vecForward*16, vecForward * 800, TRUE); break; case TANK_ROCKET_FLAKBOMB: CFlakBomb::ShootFlakBomb(pActivator->pev, vecSrc + vecForward*16, vecForward * 1800); break; case TANK_ROCKET_30MMGREN: C30mmgren::Shoot30mmgren(pActivator->pev, vecSrc + vecForward*16, vecForward * 4500); break; case TANK_ROCKET_BIOMASS: CBiomass::ShootBiomass(pActivator->pev, vecSrc + vecForward*16, vecForward * 3000, 200); break; case TANK_BEAM_BLASTER: FireBeam(vecSrc, vecForward, BEAM_BLASTER, 0, pActivator->pev); break; case TANK_BEAM_GAUSS: FireBeam(vecSrc, vecForward, BEAM_GAUSS, 0, pActivator->pev); break; case TANK_BEAM_GAUSSCHARGED: FireBeam(vecSrc, vecForward, BEAM_GAUSSCHARGED, 420, pActivator->pev); break; case TANK_BEAM_PHOTONGUN: FireBeam(vecSrc, vecForward, BEAM_PHOTONGUN, 0, pActivator->pev); break; case TANK_BEAM_PHOTONGUN_EXP: FireBeam(vecSrc, vecForward, BEAM_PHOTONGUN_EXP, 0, pActivator->pev); break; case TANK_BEAM_TAUCANNON: FireBeam(vecSrc, vecForward, BEAM_TAUCANNON, 0, pActivator->pev); break; case TANK_BEAM_PULSERIFLE: FireBeam(vecSrc, vecForward, BEAM_PULSERIFLE, 0, pActivator->pev); break; case TANK_BEAM_M72: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_2MM, pActivator->pev); break; case TANK_BEAM_M72QUAD: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_2MM_QUAD, pActivator->pev); break; case TANK_BEAM_IONTURRET: FireBeam(vecSrc, vecForward, BEAM_IONTURRET, 0, pActivator->pev); break; case TANK_BEAM_TESLAGUN: FireBeam(vecSrc, vecForward, BEAM_TESLAGUN, 0, pActivator->pev); break; } if (m_iAmmo > 0) m_iAmmo--; // update ammo counter MESSAGE_BEGIN( MSG_ONE, gmsgSpecTank, NULL, pActivator->pev ); WRITE_BYTE( 2 ); // ammo update WRITE_LONG(m_iAmmo); WRITE_BYTE( m_spread ); // crosshair update MESSAGE_END(); m_flNextAttack = gpGlobals->time + (1/m_fireRate); } else if ( pActivator->pev->button & IN_ATTACK2 && m_AllowZoom) { if (m_fInZoom == 0) { pActivator->m_iFOV = 25; m_fInZoom = 1; } else if (m_fInZoom == 1) { pActivator->m_iFOV = 90; m_fInZoom = 0; } m_flNextAttack = gpGlobals->time + 0.3; } }