//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPropVehicleManhack::ExitVehicle( int nRole ) { CBasePlayer *pPlayer = m_hPlayer; if ( !pPlayer ) return; m_hPlayer = NULL; ResetUseKey( pPlayer ); //We have to snap the eye angles because otherwise the player will look into the same direction that the manhack just did Vector vehicleEyeOrigin; QAngle vehicleEyeAngles; GetAttachment( "vehicle_driver_eyes", vehicleEyeOrigin, vehicleEyeAngles ); vehicleEyeAngles.x = 0; vehicleEyeAngles.y = 0; //pPlayer->SetAbsAngles( vehicleEyeAngles ); //pPlayer->SnapEyeAngles( vehicleEyeAngles ); pPlayer->SetAbsAngles(GetAbsAngles()); pPlayer->SnapEyeAngles(GetAbsAngles()); pPlayer->SetAbsOrigin(GetAbsOrigin()); if (m_bDriverDucked) { pPlayer->m_nButtons |= IN_DUCK; pPlayer->AddFlag( FL_DUCKING ); pPlayer->m_Local.m_bDucked = true; pPlayer->m_Local.m_bDucking = true; pPlayer->m_Local.m_flDucktime = 0.0f; pPlayer->SetViewOffset( VEC_DUCK_VIEW ); pPlayer->SetCollisionBounds( VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX ); } DevMsg("Yes, this did get updated\n"); CNPC_Manhack *pManhack = dynamic_cast<CNPC_Manhack*>((CBaseEntity*)m_hManhack); if (pManhack!=NULL) { pManhack->SetControllable(false); //pManhack->SetRenderMode(kRenderNormal); pManhack->RemoveEffects( EF_NODRAW ); pManhack->ShowRedGlow(true); } }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void CPointTeleport::DoTeleport( inputdata_t &inputdata, const Vector &vecOrigin, const QAngle &angRotation, bool bOverrideTarget ) { // Attempt to find the entity in question CBaseEntity *pTarget; if( bOverrideTarget ) { // Use the inputdata to find the entity that the designer supplied in the parameter override pTarget = gEntList.FindEntityByName( NULL, inputdata.value.String(), this, inputdata.pActivator, inputdata.pCaller ); } else { // Default behavior: Just find the entity that I am hardwired in Hammer to teleport. pTarget = gEntList.FindEntityByName( NULL, m_target, this, inputdata.pActivator, inputdata.pCaller ); } if ( pTarget == NULL ) return; // If teleport object is in a movement hierarchy, remove it first if ( EntityMayTeleport( pTarget ) == false ) { Warning("ERROR: (%s) can't teleport object (%s) as it has a parent (%s)!\n",GetDebugName(),pTarget->GetDebugName(),pTarget->GetMoveParent()->GetDebugName()); return; } // in episodic, we have a special spawn flag that forces Gordon into a duck #ifdef HL2_EPISODIC if ( (m_spawnflags & SF_TELEPORT_INTO_DUCK) && pTarget->IsPlayer() ) { CBasePlayer *pPlayer = ToBasePlayer( pTarget ); if ( pPlayer != NULL ) { pPlayer->m_nButtons |= IN_DUCK; pPlayer->AddFlag( FL_DUCKING ); pPlayer->m_Local.m_bDucked = true; pPlayer->m_Local.m_bDucking = true; pPlayer->m_Local.m_nDuckTimeMsecs = 0; pPlayer->SetViewOffset( VEC_DUCK_VIEW ); pPlayer->SetCollisionBounds( VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX ); } } #endif pTarget->Teleport( &vecOrigin, &angRotation, NULL ); }
//----------------------------------------------------------------------------- // Purpose: Causes players within the radius to be sucked in //----------------------------------------------------------------------------- void CGravityVortexController::PullPlayersInRange( void ) { CBasePlayer *pPlayer = UTIL_GetLocalPlayer(); Vector vecForce = GetAbsOrigin() - pPlayer->WorldSpaceCenter(); float dist = VectorNormalize( vecForce ); // FIXME: Need a more deterministic method here if ( dist < 128.0f ) { // Kill the player (with falling death sound and effects) CTakeDamageInfo deathInfo( this, this, GetAbsOrigin(), GetAbsOrigin(), 200, DMG_FALL ); pPlayer->TakeDamage( deathInfo ); if ( pPlayer->IsAlive() == false ) { color32 black = { 0, 0, 0, 255 }; UTIL_ScreenFade( pPlayer, black, 0.1f, 0.0f, (FFADE_OUT|FFADE_STAYOUT) ); return; } } // Must be within the radius if ( dist > m_flRadius ) return; float mass = pPlayer->VPhysicsGetObject()->GetMass(); float playerForce = m_flStrength * 0.05f; // Find the pull force // NOTE: We might want to make this non-linear to give more of a "grace distance" vecForce *= ( 1.0f - ( dist / m_flRadius ) ) * playerForce * mass; vecForce[2] *= 0.025f; pPlayer->SetBaseVelocity( vecForce ); pPlayer->AddFlag( FL_BASEVELOCITY ); // Make sure the player moves if ( vecForce.z > 0 && ( pPlayer->GetFlags() & FL_ONGROUND) ) { pPlayer->SetGroundEntity( NULL ); } }
edict_t *CPluginBotManager::CreateBot( const char *botname ) { edict_t *pEdict = engine->CreateFakeClient( botname ); if (!pEdict) { Msg( "Failed to create Bot.\n"); return NULL; } // Allocate a player entity for the bot, and call spawn CBasePlayer *pPlayer = ((CBasePlayer*)CBaseEntity::Instance( pEdict )); pPlayer->ClearFlags(); pPlayer->AddFlag( FL_CLIENT | FL_FAKECLIENT ); pPlayer->ChangeTeam( TEAM_UNASSIGNED ); pPlayer->AddEFlags( EFL_PLUGIN_BASED_BOT ); // Mark it as a plugin based bot pPlayer->RemoveAllItems( true ); pPlayer->Spawn(); return pEdict; }
void CHL2MPRules::GoToIntermission( void ) { #ifndef CLIENT_DLL if ( g_fGameOver ) return; g_fGameOver = true; m_flIntermissionEndTime = gpGlobals->curtime + mp_chattime.GetInt(); for ( int i = 0; i < MAX_PLAYERS; i++ ) { CBasePlayer *pPlayer = UTIL_PlayerByIndex( i ); if ( !pPlayer ) continue; pPlayer->ShowViewPortPanel( PANEL_SCOREBOARD ); pPlayer->AddFlag( FL_FROZEN ); } #endif }
//------------------------------------------------------------------------------ // Purpose: Samples the player's inputs and fires outputs based on what buttons // are currently held down. //------------------------------------------------------------------------------ void CGameUI::Think( void ) { CBasePlayer *pPlayer = m_player; // If player is gone, stop thinking if (pPlayer == NULL) { SetNextThink( TICK_NEVER_THINK ); return; } // If we're forcing an update, state with a clean button state if ( m_bForceUpdate ) { m_nLastButtonState = pPlayer->m_nButtons; } // ------------------------------------------------ // Check that toucher is facing the UI within // the field of view tolerance. If not disconnect // ------------------------------------------------ if (m_flFieldOfView > -1) { Vector vPlayerFacing; pPlayer->EyeVectors( &vPlayerFacing ); Vector vPlayerToUI = GetAbsOrigin() - pPlayer->WorldSpaceCenter(); VectorNormalize(vPlayerToUI); float flDotPr = DotProduct(vPlayerFacing,vPlayerToUI); if (flDotPr < m_flFieldOfView) { Deactivate( pPlayer ); return; } } pPlayer->AddFlag( FL_ONTRAIN ); SetNextThink( gpGlobals->curtime ); // Deactivate if they jump or press +use. // FIXME: prevent the use from going through in player.cpp if ((( pPlayer->m_afButtonPressed & IN_USE ) && ( m_spawnflags & SF_GAMEUI_USE_DEACTIVATES )) || (( pPlayer->m_afButtonPressed & IN_JUMP ) && ( m_spawnflags & SF_GAMEUI_JUMP_DEACTIVATES ))) { Deactivate( pPlayer ); return; } // Determine what's different int nButtonsChanged = ( pPlayer->m_nButtons ^ m_nLastButtonState ); // // Handle all our possible input triggers // if ( nButtonsChanged & IN_MOVERIGHT ) { if ( m_nLastButtonState & IN_MOVERIGHT ) { m_unpressedMoveRight.FireOutput( pPlayer, this, 0 ); } else { m_pressedMoveRight.FireOutput( pPlayer, this, 0 ); } } if ( nButtonsChanged & IN_MOVELEFT ) { if ( m_nLastButtonState & IN_MOVELEFT ) { m_unpressedMoveLeft.FireOutput( pPlayer, this, 0 ); } else { m_pressedMoveLeft.FireOutput( pPlayer, this, 0 ); } } if ( nButtonsChanged & IN_FORWARD ) { if ( m_nLastButtonState & IN_FORWARD ) { m_unpressedForward.FireOutput( pPlayer, this, 0 ); } else { m_pressedForward.FireOutput( pPlayer, this, 0 ); } } if ( nButtonsChanged & IN_BACK ) { if ( m_nLastButtonState & IN_BACK ) { m_unpressedBack.FireOutput( pPlayer, this, 0 ); } else { m_pressedBack.FireOutput( pPlayer, this, 0 ); } } if ( nButtonsChanged & IN_ATTACK ) { if ( m_nLastButtonState & IN_ATTACK ) { m_unpressedAttack.FireOutput( pPlayer, this, 0 ); } else { m_pressedAttack.FireOutput( pPlayer, this, 0 ); } } if ( nButtonsChanged & IN_ATTACK2 ) { if ( m_nLastButtonState & IN_ATTACK2 ) { m_unpressedAttack2.FireOutput( pPlayer, this, 0 ); } else { m_pressedAttack2.FireOutput( pPlayer, this, 0 ); } } // Setup for the next frame m_nLastButtonState = pPlayer->m_nButtons; float x = 0, y = 0, attack = 0, attack2 = 0; if ( pPlayer->m_nButtons & IN_MOVERIGHT ) { x = 1; } else if ( pPlayer->m_nButtons & IN_MOVELEFT ) { x = -1; } if ( pPlayer->m_nButtons & IN_FORWARD ) { y = 1; } else if ( pPlayer->m_nButtons & IN_BACK ) { y = -1; } if ( pPlayer->m_nButtons & IN_ATTACK ) { attack = 1; } if ( pPlayer->m_nButtons & IN_ATTACK2 ) { attack2 = 1; } // // Fire the analog outputs if they changed. // if ( m_bForceUpdate || ( m_xaxis.Get() != x ) ) { m_xaxis.Set( x, pPlayer, this ); } if ( m_bForceUpdate || ( m_yaxis.Get() != y ) ) { m_yaxis.Set( y, pPlayer, this ); } if ( m_bForceUpdate || ( m_attackaxis.Get() != attack ) ) { m_attackaxis.Set( attack, pPlayer, this ); } if ( m_bForceUpdate || ( m_attack2axis.Get() != attack2 ) ) { m_attack2axis.Set( attack2, pPlayer, this ); } m_bForceUpdate = false; }