/* * CG_WeaponModelUpdateRegistration */ static bool CG_WeaponModelUpdateRegistration( weaponinfo_t *weaponinfo, char *filename ) { int p; char scratch[MAX_QPATH]; for( p = 0; p < WEAPMODEL_PARTS; p++ ) { // md3 if( !weaponinfo->model[p] ) { Q_snprintfz( scratch, sizeof( scratch ), "models/weapons/%s%s.md3", filename, wmPartSufix[p] ); weaponinfo->model[p] = CG_RegisterModel( scratch ); } // skm if( !weaponinfo->model[p] ) { Q_snprintfz( scratch, sizeof( scratch ), "models/weapons/%s%s.iqm", filename, wmPartSufix[p] ); weaponinfo->model[p] = CG_RegisterModel( scratch ); } } // load failed if( !weaponinfo->model[HAND] ) { weaponinfo->name[0] = 0; for( p = 0; p < WEAPMODEL_PARTS; p++ ) weaponinfo->model[p] = NULL; return false; } // load animation script for the hand model Q_snprintfz( scratch, sizeof( scratch ), "models/weapons/%s.cfg", filename ); if( !CG_vWeap_ParseAnimationScript( weaponinfo, scratch ) ) CG_CreateHandDefaultAnimations( weaponinfo ); //create a tag_projection from tag_flash, to position fire effects CG_BuildProjectionOrigin( weaponinfo ); Vector4Set( weaponinfo->outlineColor, 0, 0, 0, 255 ); if( cg_debugWeaponModels->integer ) CG_Printf( "%sWEAPmodel: Loaded successful%s\n", S_COLOR_BLUE, S_COLOR_WHITE ); Q_strncpyz( weaponinfo->name, filename, sizeof( weaponinfo->name ) ); return true; }
/* * CG_RegisterModels */ static void CG_RegisterModels( void ) { int i; char *name; name = cgs.configStrings[CS_WORLDMODEL]; if( name[0] ) { trap_R_RegisterWorldModel( name ); CG_LoadingString( name ); } CG_LoadingString( "models" ); cgs.numWeaponModels = 1; Q_strncpyz( cgs.weaponModels[0], "generic/generic.md3", sizeof( cgs.weaponModels[0] ) ); for( i = 1; i < MAX_MODELS; i++ ) { name = cgs.configStrings[CS_MODELS+i]; if( !name[0] ) break; if( name[0] == '#' ) { // special player weapon model if( cgs.numWeaponModels < WEAP_TOTAL ) { Q_strncpyz( cgs.weaponModels[cgs.numWeaponModels], name+1, sizeof( cgs.weaponModels[cgs.numWeaponModels] ) ); cgs.numWeaponModels++; CG_LoadingItemName( name ); } } else if( name[0] == '$' ) { // indexed pmodel cgs.pModelsIndex[i] = CG_RegisterPlayerModel( name+1 ); CG_LoadingItemName( name ); } else { CG_LoadingItemName( name ); cgs.modelDraw[i] = CG_RegisterModel( name ); } } CG_RegisterMediaModels(); CG_RegisterBasePModel(); // never before registering the weapon models CG_RegisterWeaponModels(); // precache forcemodels if defined CG_RegisterForceModels(); // create a tag to offset the weapon models when seen in the world as items VectorSet( cgs.weaponItemTag.origin, 0, 0, 0 ); Matrix3_Copy( axis_identity, cgs.weaponItemTag.axis ); VectorMA( cgs.weaponItemTag.origin, -14, &cgs.weaponItemTag.axis[AXIS_FORWARD], cgs.weaponItemTag.origin ); }
/* * CG_MediaModel */ struct model_s *CG_MediaModel( cgs_media_handle_t *mediamodel ) { if( !mediamodel ) return NULL; if( !mediamodel->data ) mediamodel->data = ( void * )CG_RegisterModel( mediamodel->name ); return ( struct model_s * )mediamodel->data; }
/* * CG_RegisterMediaModel */ static cgs_media_handle_t *CG_RegisterMediaModel( const char *name, bool precache ) { cgs_media_handle_t *mediamodel; for( mediamodel = model_headnode; mediamodel; mediamodel = mediamodel->next ) { if( !Q_stricmp( mediamodel->name, name ) ) return mediamodel; } mediamodel = ( cgs_media_handle_t * )CG_Malloc( sizeof( cgs_media_handle_t ) ); mediamodel->name = CG_CopyString( name ); mediamodel->next = model_headnode; model_headnode = mediamodel; if( precache ) mediamodel->data = ( void * )CG_RegisterModel( mediamodel->name ); return mediamodel; }
/* * CG_ConfigString */ void CG_ConfigString( int i, const char *s ) { size_t len; // wsw : jal : warn if configstring overflow len = strlen( s ); if( len >= MAX_CONFIGSTRING_CHARS ) CG_Printf( "%sWARNING:%s Configstring %i overflowed\n", S_COLOR_YELLOW, S_COLOR_WHITE, i ); if( i < 0 || i >= MAX_CONFIGSTRINGS ) CG_Error( "configstring > MAX_CONFIGSTRINGS" ); Q_strncpyz( cgs.configStrings[i], s, sizeof( cgs.configStrings[i] ) ); // do something apropriate if( i == CS_MAPNAME ) { CG_RegisterLevelMinimap(); } else if( i == CS_TVSERVER ) { CG_UpdateTVServerString(); } else if( i == CS_GAMETYPETITLE ) { } else if( i == CS_GAMETYPENAME ) { GS_SetGametypeName( cgs.configStrings[CS_GAMETYPENAME] ); } else if( i == CS_AUTORECORDSTATE ) { CG_SC_AutoRecordAction( cgs.configStrings[i] ); } else if( i >= CS_MODELS && i < CS_MODELS+MAX_MODELS ) { if( cgs.configStrings[i][0] == '$' ) // indexed pmodel cgs.pModelsIndex[i-CS_MODELS] = CG_RegisterPlayerModel( cgs.configStrings[i]+1 ); else cgs.modelDraw[i-CS_MODELS] = CG_RegisterModel( cgs.configStrings[i] ); } else if( i >= CS_SOUNDS && i < CS_SOUNDS+MAX_SOUNDS ) { if( cgs.configStrings[i][0] != '*' ) cgs.soundPrecache[i-CS_SOUNDS] = trap_S_RegisterSound( cgs.configStrings[i] ); } else if( i >= CS_IMAGES && i < CS_IMAGES+MAX_IMAGES ) { cgs.imagePrecache[i-CS_IMAGES] = trap_R_RegisterPic( cgs.configStrings[i] ); } else if( i >= CS_SKINFILES && i < CS_SKINFILES+MAX_SKINFILES ) { cgs.skinPrecache[i-CS_SKINFILES] = trap_R_RegisterSkinFile( cgs.configStrings[i] ); } else if( i >= CS_LIGHTS && i < CS_LIGHTS+MAX_LIGHTSTYLES ) { CG_SetLightStyle( i - CS_LIGHTS ); } else if( i >= CS_ITEMS && i < CS_ITEMS+MAX_ITEMS ) { CG_ValidateItemDef( i - CS_ITEMS, cgs.configStrings[i] ); } else if( i >= CS_PLAYERINFOS && i < CS_PLAYERINFOS+MAX_CLIENTS ) { CG_LoadClientInfo( &cgs.clientInfo[i-CS_PLAYERINFOS], cgs.configStrings[i], i-CS_PLAYERINFOS ); } else if( i >= CS_GAMECOMMANDS && i < CS_GAMECOMMANDS+MAX_GAMECOMMANDS ) { if( !cgs.demoPlaying ) { trap_Cmd_AddCommand( cgs.configStrings[i], NULL ); if( !Q_stricmp( cgs.configStrings[i], "gametypemenu" ) ) { cgs.hasGametypeMenu = qtrue; } } } else if( i >= CS_WEAPONDEFS && i < CS_WEAPONDEFS + MAX_WEAPONDEFS ) { CG_OverrideWeapondef( i - CS_WEAPONDEFS, cgs.configStrings[i] ); } }