/*QUAKED props_skyportal (.6 .7 .7) (-8 -8 0) (8 8 16) "fov" for the skybox default is 90 To have the portal sky fogged, enter any of the following values: "fogcolor" (r g b) (values 0.0-1.0) "fognear" distance from entity to start fogging (FIXME? Supported by RTCW, but not Spearmint) "fogfar" distance from entity that fog is opaque */ void SP_skyportal( void ) { int fogn; int isfog; cg.hasSkyPortal = qtrue; CG_SpawnVector( "origin", "0 0 0", cg.skyPortalOrigin ); isfog = CG_SpawnVector( "fogcolor", "0 0 0", cg.skyPortalFogColor ); isfog += CG_SpawnInt( "fognear", "0", &fogn ); isfog += CG_SpawnInt( "fogfar", "300", &cg.skyPortalFogDepthForOpaque ); if ( !isfog ) { cg.skyPortalFogDepthForOpaque = 0; } }
void SP_info_train_spline_main( void ) { char* targetname; char* target; char* control; vec3_t origin; int i; char* end; splinePath_t* spline; if ( !CG_SpawnVector( "origin", "0 0 0", origin ) ) { CG_Error( "info_train_spline_main with no origin\n" ); } if ( !CG_SpawnString( "targetname", "", &targetname ) ) { CG_Error( "info_train_spline_main with no targetname at %s\n", vtos( origin ) ); } CG_SpawnString( "target", "", &target ); spline = BG_AddSplinePath( targetname, target, origin ); if ( CG_SpawnString( "end", "", &end ) ) { spline->isEnd = true; } else if ( CG_SpawnString( "start", "", &end ) ) { spline->isStart = true; } for ( i = 1;; i++ ) { if ( !CG_SpawnString( i == 1 ? va( "control" ) : va( "control%i", i ), "", &control ) ) { break; } BG_AddSplineControl( spline, control ); } }
void SP_misc_skyportal_orient( void ) { vec3_t org; vec_t scale; if( cg_skyOri ) { CG_Error( "ERROR: multiple misc_skyportal_orients found" ); } CG_SpawnVector( "origin", "0 0 0", org ); CG_SpawnFloat( "modelscale", "0", &scale ); VectorCopy( org, cg_skyOriPos ); cg_skyOriScale = scale; cg_skyOri = qtrue; }
void SP_path_corner_2( void ) { char* targetname; vec3_t origin; CG_SpawnString( "targetname", "", &targetname ); CG_SpawnVector( "origin", "0 0 0", origin ); if ( !*targetname ) { CG_Error( "path_corner_2 with no targetname at %s\n", vtos( origin ) ); return; } if ( numPathCorners >= MAX_PATH_CORNERS ) { CG_Error( "Maximum path_corners hit\n" ); return; } BG_AddPathCorner( targetname, origin ); }
void SP_misc_gamemodel( void ) { char* model; vec_t angle; vec3_t angles; vec_t scale; vec3_t vScale; vec3_t org; cg_gamemodel_t* gamemodel; int i; if ( CG_SpawnString( "targetname", "", &model ) || CG_SpawnString( "scriptname", "", &model ) || CG_SpawnString( "spawnflags", "", &model ) ) { // Gordon: this model may not be static, so let the server handle it return; } if ( cg.numMiscGameModels >= MAX_STATIC_GAMEMODELS ) { CG_Error( "^1MAX_STATIC_GAMEMODELS(%i) hit", MAX_STATIC_GAMEMODELS ); } CG_SpawnString( "model", "", &model ); CG_SpawnVector( "origin", "0 0 0", org ); if ( !CG_SpawnVector( "angles", "0 0 0", angles ) ) { if ( CG_SpawnFloat( "angle", "0", &angle ) ) { angles[YAW] = angle; } } if ( !CG_SpawnVector( "modelscale_vec", "1 1 1", vScale ) ) { if ( CG_SpawnFloat( "modelscale", "1", &scale ) ) { VectorSet( vScale, scale, scale, scale ); } } gamemodel = &cgs.miscGameModels[cg.numMiscGameModels++]; gamemodel->model = trap_R_RegisterModel( model ); AnglesToAxis( angles, gamemodel->axes ); for ( i = 0; i < 3; i++ ) { VectorScale( gamemodel->axes[i], vScale[i], gamemodel->axes[i] ); } VectorCopy( org, gamemodel->org ); if ( gamemodel->model ) { vec3_t mins, maxs; trap_R_ModelBounds( gamemodel->model, mins, maxs ); for ( i = 0; i < 3; i++ ) { mins[i] *= vScale[i]; maxs[i] *= vScale[i]; } gamemodel->radius = RadiusFromBounds( mins, maxs ); } else { gamemodel->radius = 0; } }
void SP_misc_model_static( void ) { char* model; vec_t angle; vec3_t angles; vec_t scale; vec3_t vScale; vec3_t org; vec_t zoffset; int i; int modelIndex; cg_staticmodel_t *staticmodel; if( cgs.numMiscStaticModels >= MAX_STATIC_MODELS ) { CG_Error( "MAX_STATIC_MODELS(%i) hit", MAX_STATIC_MODELS ); } CG_SpawnString( "model", "", &model ); if( !model || !model[0] ) { CG_Error( "misc_model_static with no model." ); } CG_SpawnVector( "origin", "0 0 0", org ); CG_SpawnFloat( "zoffset", "0", &zoffset ); if( !CG_SpawnVector( "angles", "0 0 0", angles ) ) { if( CG_SpawnFloat( "angle", "0", &angle ) ) { angles[YAW] = angle; } } if( !CG_SpawnVector( "modelscale_vec", "1 1 1", vScale ) ) { if( CG_SpawnFloat( "modelscale", "1", &scale ) ) { VectorSet( vScale, scale, scale, scale ); } } modelIndex = trap_R_RegisterModel( model ); if( modelIndex == 0 ) { CG_Error( "misc_model_static failed to load model '%s'", model ); return; } staticmodel = &cgs.miscStaticModels[cgs.numMiscStaticModels++]; staticmodel->model = modelIndex; AnglesToAxis( angles, staticmodel->axes ); for( i = 0; i < 3; i++ ) { VectorScale( staticmodel->axes[i], vScale[i], staticmodel->axes[i] ); } VectorCopy( org, staticmodel->org ); staticmodel->zoffset = zoffset; if( staticmodel->model ) { vec3_t mins, maxs; trap_R_ModelBounds( staticmodel->model, mins, maxs ); VectorScaleVector( mins, vScale, mins ); VectorScaleVector( maxs, vScale, maxs ); staticmodel->radius = RadiusFromBounds( mins, maxs ); } else { staticmodel->radius = 0; } }
void SP_misc_gamemodel( void ) { char* model; char* skin; vec_t angle; vec3_t angles; vec_t scale; vec3_t vScale; vec3_t org; cg_gamemodel_t* gamemodel; int i; #if 0 // ZTM: Note: Spearmint's game always drops misc_gamemodels. Also, RTCW has targetname set though I'm not sure what, if anything, it's used for. if ( CG_SpawnString( "targetname", "", &model ) || CG_SpawnString( "scriptname", "", &model ) || CG_SpawnString( "spawnflags", "", &model ) ) { // Gordon: this model may not be static, so let the server handle it return; } #endif if ( cg.numMiscGameModels >= MAX_STATIC_GAMEMODELS ) { CG_Error( "^1MAX_STATIC_GAMEMODELS(%i) hit", MAX_STATIC_GAMEMODELS ); } CG_SpawnString( "model", "", &model ); CG_SpawnString( "skin", "", &skin ); CG_SpawnVector( "origin", "0 0 0", org ); if ( !CG_SpawnVector( "angles", "0 0 0", angles ) ) { if ( CG_SpawnFloat( "angle", "0", &angle ) ) { angles[YAW] = angle; } } if ( !CG_SpawnVector( "modelscale_vec", "1 1 1", vScale ) ) { if ( CG_SpawnFloat( "modelscale", "1", &scale ) ) { VectorSet( vScale, scale, scale, scale ); } } gamemodel = &cgs.miscGameModels[cg.numMiscGameModels++]; gamemodel->model = trap_R_RegisterModel( model ); if ( *skin ) { CG_RegisterSkin( skin, &gamemodel->skin, qfalse ); } AnglesToAxis( angles, gamemodel->axes ); for ( i = 0; i < 3; i++ ) { VectorScale( gamemodel->axes[i], vScale[i], gamemodel->axes[i] ); } VectorCopy( org, gamemodel->org ); if ( gamemodel->model ) { vec3_t mins, maxs; trap_R_ModelBounds( gamemodel->model, mins, maxs, 0, 0, 0 ); for ( i = 0; i < 3; i++ ) { mins[i] *= vScale[i]; maxs[i] *= vScale[i]; } gamemodel->radius = RadiusFromBounds( mins, maxs ); } else { gamemodel->radius = 0; } }