// make the entity carry out the scripted sequence instructions, but without // destroying the monster's state. void CCineAI::PossessEntity( void ) { Schedule_t *pNewSchedule; CBaseEntity *pEntity = m_hTargetEnt; CBaseMonster *pTarget = NULL; if( pEntity ) pTarget = pEntity->MyMonsterPointer(); if( pTarget ) { if( !pTarget->CanPlaySequence( FCanOverrideState(), SS_INTERRUPT_AI ) ) { ALERT( at_aiconsole, "(AI)Can't possess entity %s\n", pTarget->GetClassname() ); return; } pTarget->m_hGoalEnt = this; pTarget->m_pCine = this; pTarget->m_hTargetEnt = this; m_saved_movetype = pTarget->GetMoveType(); m_saved_solid = pTarget->GetSolidType(); m_saved_effects = pTarget->GetEffects(); pTarget->GetEffects() |= GetEffects(); switch( m_fMoveTo ) { case 0: case 5: pTarget->m_scriptState = SCRIPT_WAIT; break; case 1: pTarget->m_scriptState = SCRIPT_WALK_TO_MARK; break; case 2: pTarget->m_scriptState = SCRIPT_RUN_TO_MARK; break; case 4: { // zap the monster instantly to the site of the script entity. pTarget->SetAbsOrigin( GetAbsOrigin() ); pTarget->SetIdealYaw( GetAbsAngles().y ); pTarget->SetAngularVelocity( g_vecZero ); pTarget->SetAbsVelocity( Vector( 0, 0, 0 ) ); pTarget->GetEffects() |= EF_NOINTERP; Vector vecAngles = pTarget->GetAbsAngles(); vecAngles.y = GetAbsAngles().y; pTarget->SetAbsAngles( vecAngles ); pTarget->m_scriptState = SCRIPT_WAIT; m_startTime = gpGlobals->time + 1E6; // UNDONE: Add a flag to do this so people can fixup physics after teleporting monsters pTarget->GetFlags().ClearFlags( FL_ONGROUND ); break; } default: ALERT( at_aiconsole, "aiscript: invalid Move To Position value!" ); break; } ALERT( at_aiconsole, "\"%s\" found and used\n", pTarget->GetTargetname() ); pTarget->m_IdealMonsterState = MONSTERSTATE_SCRIPT; /* if (m_iszIdle) { StartSequence( pTarget, m_iszIdle, false ); if (FStrEq( STRING(m_iszIdle), STRING(m_iszPlay))) { pTarget->SetFrameRate( 0 ); } } */ // Already in a scripted state? if( pTarget->m_MonsterState == MONSTERSTATE_SCRIPT ) { pNewSchedule = pTarget->GetScheduleOfType( SCHED_AISCRIPT ); pTarget->ChangeSchedule( pNewSchedule ); } } }
// make the entity enter a scripted sequence void CCineMonster::PossessEntity( void ) { CBaseEntity *pEntity = m_hTargetEnt; CBaseMonster *pTarget = NULL; if( pEntity ) pTarget = pEntity->MyMonsterPointer(); if( pTarget ) { // FindEntity() just checked this! #if 0 if( !pTarget->CanPlaySequence( FCanOverrideState() ) ) { ALERT( at_aiconsole, "Can't possess entity %s\n", pTarget->GetClassname() ); return; } #endif pTarget->m_hGoalEnt = this; pTarget->m_pCine = this; pTarget->m_hTargetEnt = this; m_saved_movetype = pTarget->GetMoveType(); m_saved_solid = pTarget->GetSolidType(); m_saved_effects = pTarget->GetEffects(); pTarget->GetEffects() |= GetEffects(); switch( m_fMoveTo ) { case 0: pTarget->m_scriptState = SCRIPT_WAIT; break; case 1: pTarget->m_scriptState = SCRIPT_WALK_TO_MARK; DelayStart( true ); break; case 2: pTarget->m_scriptState = SCRIPT_RUN_TO_MARK; DelayStart( true ); break; case 4: pTarget->SetAbsOrigin( GetAbsOrigin() ); pTarget->SetIdealYaw( GetAbsAngles().y ); pTarget->SetAngularVelocity( g_vecZero ); pTarget->SetAbsVelocity( Vector( 0, 0, 0 ) ); pTarget->GetEffects() |= EF_NOINTERP; Vector vecAngles = pTarget->GetAbsAngles(); vecAngles.y = GetAbsAngles().y; pTarget->SetAbsAngles( vecAngles ); pTarget->m_scriptState = SCRIPT_WAIT; m_startTime = gpGlobals->time + 1E6; // UNDONE: Add a flag to do this so people can fixup physics after teleporting monsters // pTarget->GetFlags().ClearFlags( FL_ONGROUND ); break; } // ALERT( at_aiconsole, "\"%s\" found and used (INT: %s)\n", pTarget->GetTargetname(), GetSpawnFlags().Any( SF_SCRIPT_NOINTERRUPT ) ?"No":"Yes" ); pTarget->m_IdealMonsterState = MONSTERSTATE_SCRIPT; if( m_iszIdle ) { StartSequence( pTarget, m_iszIdle, false ); if( FStrEq( STRING( m_iszIdle ), STRING( m_iszPlay ) ) ) { pTarget->SetFrameRate( 0 ); } } } }