/* ======================= G_RegisterPlayerClasses ======================= */ void G_RegisterPlayerClasses( void ) { bg_playerclass_t *classInfo; bg_character_t *character; int team, cls; for ( team = TEAM_AXIS; team <= TEAM_ALLIES; team++ ) { for ( cls = PC_SOLDIER; cls < NUM_PLAYER_CLASSES; cls++ ) { classInfo = BG_GetPlayerClassInfo( team, cls ); character = BG_GetCharacter( team, cls ); Q_strncpyz( character->characterFile, classInfo->characterFile, sizeof( character->characterFile ) ); if ( !G_RegisterCharacter( character->characterFile, character ) ) { G_Error( "ERROR: G_RegisterPlayerClasses: failed to load character file '%s' for the %s %s\n", character->characterFile, ( team == TEAM_AXIS ? "Axis" : "Allied" ), BG_ClassnameForNumber( classInfo->classNum ) ); } } } }
/* ================= G_UpdateCharacter ================= */ void G_UpdateCharacter( gclient_t *client ) { char infostring[MAX_INFO_STRING]; char *s; int characterIndex; bg_character_t *character; trap_GetUserinfo( client - level.clients, infostring, sizeof( infostring ) ); s = Info_ValueForKey( infostring, "ch" ); if( *s ) { characterIndex = atoi(s); if( characterIndex < 0 || characterIndex >= MAX_CHARACTERS ) { goto set_default_character; } if( client->pers.characterIndex != characterIndex ) { client->pers.characterIndex = characterIndex; trap_GetConfigstring( CS_CHARACTERS + characterIndex, infostring, MAX_INFO_STRING ); if( !(client->pers.character = BG_FindCharacter( infostring ) ) ) { // not found - create it (this should never happen as we should have everything precached) client->pers.character = BG_FindFreeCharacter( infostring ); if ( !client->pers.character ) { goto set_default_character; } Q_strncpyz( client->pers.character->characterFile, infostring, sizeof(client->pers.character->characterFile) ); if( !G_RegisterCharacter( infostring, client->pers.character ) ) { G_Printf( S_COLOR_YELLOW "WARNING: G_UpdateCharacter: failed to load character file '%s' for %s\n", infostring, client->pers.netname); goto set_default_character; } } // RF, reset anims so client's dont freak out // xkan: this can only be done if the model really changed - otherwise, the // animation may get screwed up if we are in the middle of some animation // and we come into this function; // plus, also reset the timer so we can properly start the next animation client->ps.legsAnim = 0; client->ps.torsoAnim = 0; client->ps.legsTimer = 0; client->ps.torsoTimer = 0; } return; } set_default_character: // set default character character = BG_GetCharacter( client->sess.sessionTeam, client->sess.playerType ); if( client->pers.character != character ) { client->pers.characterIndex = -1; client->pers.character = character; client->ps.legsAnim = 0; client->ps.torsoAnim = 0; client->ps.legsTimer = 0; client->ps.torsoTimer = 0; } }
static void CG_DrawPlayerStatusHead(hudComponent_t comp) { hudHeadAnimNumber_t anim = cg.idleAnim; bg_character_t *character = CG_CharacterForPlayerstate(&cg.snap->ps); bg_character_t *headcharacter = BG_GetCharacter(cgs.clientinfo[cg.snap->ps.clientNum].team, cgs.clientinfo[cg.snap->ps.clientNum].cls); qhandle_t painshader = 0; rectDef_t *headRect = &comp.location; if (!comp.visible) { return; } if (cg.weaponFireTime > 500) { anim = HD_ATTACK; } else if (cg.time - cg.lastFiredWeaponTime < 500) { anim = HD_ATTACK_END; } else if (cg.time - cg.painTime < (character->hudheadanimations[HD_PAIN].numFrames * character->hudheadanimations[HD_PAIN].frameLerp)) { anim = HD_PAIN; } else if (cg.time > cg.nextIdleTime) { cg.nextIdleTime = cg.time + 7000 + rand() % 1000; if (cg.snap->ps.stats[STAT_HEALTH] < 40) { cg.idleAnim = (rand() % (HD_DAMAGED_IDLE3 - HD_DAMAGED_IDLE2 + 1)) + HD_DAMAGED_IDLE2; } else { cg.idleAnim = (rand() % (HD_IDLE8 - HD_IDLE2 + 1)) + HD_IDLE2; } cg.lastIdleTimeEnd = cg.time + character->hudheadanimations[cg.idleAnim].numFrames * character->hudheadanimations[cg.idleAnim].frameLerp; } if (cg.snap->ps.stats[STAT_HEALTH] < 5) { painshader = cgs.media.hudDamagedStates[3]; } else if (cg.snap->ps.stats[STAT_HEALTH] < 20) { painshader = cgs.media.hudDamagedStates[2]; } else if (cg.snap->ps.stats[STAT_HEALTH] < 40) { painshader = cgs.media.hudDamagedStates[1]; } else if (cg.snap->ps.stats[STAT_HEALTH] < 60) { painshader = cgs.media.hudDamagedStates[0]; } if (cg.time > cg.lastIdleTimeEnd) { if (cg.snap->ps.stats[STAT_HEALTH] < 40) { cg.idleAnim = HD_DAMAGED_IDLE1; } else { cg.idleAnim = HD_IDLE1; } } CG_DrawPlayerHead(headRect, character, headcharacter, 180, 0, cg.snap->ps.eFlags & EF_HEADSHOT ? qfalse : qtrue, anim, painshader, cgs.clientinfo[cg.snap->ps.clientNum].rank, qfalse); }