//----------------------------------------------------------------------------- // Purpose: Finished our deploy //----------------------------------------------------------------------------- void CVehicleTeleportStation::OnFinishedDeploy( void ) { BaseClass::OnFinishedDeploy(); ValidDeployPosition(); SetBodygroup( 1, false ); // Find the teleport in the mothership CFuncMassTeleport *pTeleporter = NULL; while ( (pTeleporter = (CFuncMassTeleport*)gEntList.FindEntityByClassname( pTeleporter, "func_mass_teleport" )) != NULL ) { if ( pTeleporter->IsMCVTeleport() ) { m_hTeleportExit = pTeleporter; m_hTeleportExit->AddMCV( this ); break; } } // Put some flares down to mark the teleport zone Vector vecOrigin; QAngle vecAngles; for ( int i = 0; i < 4; i++ ) { char buf[64]; Q_snprintf( buf, 64, "teleport_corner%d", i+1 ); if ( GetAttachment( buf, vecOrigin, vecAngles ) ) { CheckBuildPoint( vecOrigin + Vector(0,0,64), Vector(0,0,128), &vecOrigin ); m_hTeleportCornerSprites[i] = CSprite::SpriteCreate( "sprites/redglow1.vmt", vecOrigin, false ); m_hTeleportCornerSprites[i]->SetTransparency( kRenderGlow, 255, 255, 255, 255, kRenderFxNoDissipation ); m_hTeleportCornerSprites[i]->SetScale( 0.1 ); } } // Get the ray point if ( GetAttachment( "muzzle", vecOrigin, vecAngles ) ) { m_hTeleportCornerSprites[4] = CSprite::SpriteCreate( "sprites/redglow1.vmt", vecOrigin, false ); m_hTeleportCornerSprites[4]->SetTransparency( kRenderGlow, 255, 255, 255, 255, kRenderFxNoDissipation ); m_hTeleportCornerSprites[4]->SetScale( 0.1 ); } SetContextThink( PostTeleportThink, gpGlobals->curtime + 0.1, TELEPORT_STATION_THINK_CONTEXT ); // Add ourselves to the list of deployed MCVs. s_DeployedTeleportStations.AddToTail( this ); // Set our vehicle bay screen's buildpoint for ( i = m_hScreens.Count(); --i >= 0; ) { if (m_hScreens[i].Get()) { CVGuiScreenVehicleBay *pScreen = dynamic_cast<CVGuiScreenVehicleBay*>( m_hScreens[0].Get() ); if ( pScreen ) { Vector vecOrigin; QAngle vecAngles; if ( GetAttachment( "vehiclebay", vecOrigin, vecAngles ) ) { pScreen->SetBuildPoint( vecOrigin, vecAngles ); } } } } SetControlPanelsActive( true ); SignalChangeInMCVSelectionPanels(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CObjectResupply::CalculatePlacement( CBaseTFPlayer *pPlayer ) { trace_t tr; Vector vecAiming; // Get an aim vector. Don't use GetAimVector() because we don't want autoaiming. Vector vecSrc = pPlayer->Weapon_ShootPosition( ); pPlayer->EyeVectors( &vecAiming ); Vector vecTarget; VectorMA( vecSrc, 90, vecAiming, vecTarget ); m_vecBuildOrigin = vecTarget; // Angle it towards me Vector vecForward = pPlayer->WorldSpaceCenter() - m_vecBuildOrigin; SetLocalAngles( QAngle( 0, UTIL_VecToYaw( vecForward ), 0 ) ); // Is there something to attach to? // Use my bounding box, not the build box, so I fit to the wall UTIL_TraceLine( vecSrc, vecTarget, MASK_SOLID, pPlayer, COLLISION_GROUP_PLAYER_MOVEMENT, &tr); //UTIL_TraceHull( vecSrc, vecTarget, WorldAlignMins(), WorldAlignMaxs(), MASK_SOLID, pPlayer, TFCOLLISION_GROUP_OBJECT, &tr ); m_vecBuildOrigin = tr.endpos; bool bTryToPlaceGroundVersion = false; if ( tr.allsolid || (tr.fraction == 1.0) ) { bTryToPlaceGroundVersion = true; } else { // Make sure we're planting on the world CBaseEntity *pEntity = tr.m_pEnt; if ( pEntity != GetWorldEntity() ) { bTryToPlaceGroundVersion = true; } } // Make sure the wall we've touched is vertical if ( !bTryToPlaceGroundVersion && fabs(tr.plane.normal.z) > 0.3 ) { bTryToPlaceGroundVersion = true; } // Aborting? if ( bTryToPlaceGroundVersion ) { // We couldn't find a wall, so try and place a ground version instead if ( GetTeamNumber() == TEAM_HUMANS ) { SetModel( RESUPPLY_GROUND_MODEL_HUMAN ); } else { SetModel( RESUPPLY_GROUND_MODEL ); } UTIL_SetSize(this, RESUPPLY_GROUND_MINS, RESUPPLY_GROUND_MAXS); m_vecBuildMins = WorldAlignMins() - Vector( 4,4,0 ); m_vecBuildMaxs = WorldAlignMaxs() + Vector( 4,4,0 ); return BaseClass::CalculatePlacement( pPlayer ); } SetupAttachedVersion(); m_vecBuildMins = WorldAlignMins() - Vector( 4,4,0 ); m_vecBuildMaxs = WorldAlignMaxs() + Vector( 4,4,0 ); // Set the angles vecForward = tr.plane.normal; SetLocalAngles( QAngle( 0, UTIL_VecToYaw( vecForward ), 0 ) ); // Trace back from the corners Vector vecMins, vecMaxs, vecModelMins, vecModelMaxs; const model_t *pModel = GetModel(); modelinfo->GetModelBounds( pModel, vecModelMins, vecModelMaxs ); // Check the four build points Vector vecPointCheck = (vecForward * 32); Vector vecUp = Vector(0,0,1); Vector vecRight; CrossProduct( vecUp, vecForward, vecRight ); float flWidth = fabs(vecModelMaxs.y - vecModelMins.y) * 0.5; float flHeight = fabs(vecModelMaxs.z - vecModelMins.z) * 0.5; bool bResult = true; if ( bResult ) { bResult = CheckBuildPoint( m_vecBuildOrigin + (vecRight * flWidth) + (vecUp * flHeight), vecPointCheck ); } if ( bResult ) { bResult = CheckBuildPoint( m_vecBuildOrigin + (vecRight * flWidth) - (vecUp * flHeight), vecPointCheck ); } if ( bResult ) { bResult = CheckBuildPoint( m_vecBuildOrigin - (vecRight * flWidth) + (vecUp * flHeight), vecPointCheck ); } if ( bResult ) { bResult = CheckBuildPoint( m_vecBuildOrigin - (vecRight * flWidth) - (vecUp * flHeight), vecPointCheck ); } AttemptToFindPower(); return bResult; }