## ETPub PCR alpha hacks (etpub_pcr_ah) ## (C) 2006-2007 PatheticCockroach.com ## This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License ## Derivative works may only be done if they are distributed with their source code. ## ## The original etpub_pcr_ah source and binaries can be found around http://www.patheticcockroach.com/etserver/etpub_pcr.php ## ## Note : ETPub PCR alpha hacks are just small modifications for ETPub (http://www.etpub.org) Client have the possibility to display icons instead of class names. cg_icon4class : boolean, client side 0 - default ETPub display 1 - show class icon instead of text in scoreboard and above players heads Default : 1 ------------------------- MODIFICATION STARTS HERE src\cgame\cg_local.h (line 2513) **** BEFORE // forty - Phoenix - scale weapon for custom FOV settings extern vmCvar_t cg_gun_fovscale; **** ADD // PatheticCockroach - class iconization extern vmCvar_t cg_icon4class; src\cgame\cg_main.c (line 345) **** BEFORE // forty - Phoenix - scale weapon for custom FOV settings vmCvar_t cg_gun_fovscale; **** ADD // PatheticCockroach - class iconization vmCvar_t cg_icon4class; (line 642) **** BEFORE // forty - #297 - watermark // HOLLEMOD - START { &g_watermark, "g_watermark", "", 0 }, **** ADD // PatheticCockroach - class iconization { &cg_icon4class, "cg_icon4class", "1", 0 }, src\cgame\cg_scoreboard.c : (line 321) **** REPLACE // OSP - allow MV clients see the class of its merged client's on the scoreboard else if ( cg.snap->ps.persistant[PERS_TEAM] == ci->team || CG_mvMergedClientLocate(score->client) ) { CG_DrawSmallString( tempx, y, CG_TranslateString( BG_ShortClassnameForNumber( score->playerClass ) ), fade ); } **** WITH // OSP - allow MV clients see the class of its merged client's on the scoreboard else if ( cg.snap->ps.persistant[PERS_TEAM] == ci->team || CG_mvMergedClientLocate(score->client) ) { if(cg_icon4class.integer==0) CG_DrawSmallString( tempx, y, CG_TranslateString( BG_ShortClassnameForNumber( score->playerClass ) ), fade ); else CG_DrawPic( tempx - 3, y - 6, 28, 28, cgs.media.limboClassButtons2[score->playerClass] ); } (line 532) **** REPLACE else if ( cg.snap->ps.persistant[PERS_TEAM] == ci->team ) { CG_DrawStringExt( tempx, y, CG_TranslateString( BG_ShortClassnameForNumber( score->playerClass ) ), hcolor, qfalse, qfalse, MINICHAR_WIDTH, MINICHAR_HEIGHT, 0 ); // CG_DrawSmallString( tempx, y, CG_TranslateString( s ), fade ); } **** WITH else if ( cg.snap->ps.persistant[PERS_TEAM] == ci->team ) { if(cg_icon4class.integer==0) CG_DrawStringExt( tempx, y, CG_TranslateString( BG_ShortClassnameForNumber( score->playerClass ) ), hcolor, qfalse, qfalse, MINICHAR_WIDTH, MINICHAR_HEIGHT, 0 ); //CG_DrawSmallString( tempx, y, CG_TranslateString( s ), fade ); else CG_DrawPic( tempx - 3, y - 4, 20, 20, cgs.media.limboClassButtons2[score->playerClass] ); } src\cgame\cg_draw.c (line 2570) **** REPLACE // determine player class // Dens: changed 6 into 7 playerClass = BG_ClassLetterForNumber( (cg_entities[ cg.crosshairClientNum ].currentState.powerups >> PW_OPS_CLASS_1) & 7 ); name = cgs.clientinfo[ cg.crosshairClientNum ].disguiseName; playerRank = cgs.clientinfo[ cg.crosshairClientNum ].team != TEAM_AXIS ? rankNames_Axis[cgs.clientinfo[cg.crosshairClientNum].disguiseRank] : rankNames_Allies[cgs.clientinfo[cg.crosshairClientNum].disguiseRank]; s = va( "[%s] %s %s", CG_TranslateString( playerClass ), playerRank, name ); w = CG_DrawStrlen( s ) * SMALLCHAR_WIDTH; // draw the name and class if( cg_drawCrosshairNames.integer == 2) { // name without color CG_DrawSmallStringColor( 320 - w / 2, 170, s, color ); } else { // colored names CG_DrawStringExt( 320 - w / 2, 170, s, color, qfalse, qtrue, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); } **** WITH // determine player class // Dens: changed 6 into 7 playerClass = BG_ClassLetterForNumber( (cg_entities[ cg.crosshairClientNum ].currentState.powerups >> PW_OPS_CLASS_1) & 7 ); name = cgs.clientinfo[ cg.crosshairClientNum ].disguiseName; playerRank = cgs.clientinfo[ cg.crosshairClientNum ].team != TEAM_AXIS ? rankNames_Axis[cgs.clientinfo[cg.crosshairClientNum].disguiseRank] : rankNames_Allies[cgs.clientinfo[cg.crosshairClientNum].disguiseRank]; // PatheticCockroach - icon if cg_icon4class == 1 if(cg_icon4class.integer==0) s = va( "[%s] %s %s", CG_TranslateString( playerClass ), playerRank, name ); else s = va( "%s %s", playerRank, name ); w = CG_DrawStrlen( s ) * SMALLCHAR_WIDTH; // draw the name and class // PatheticCockroach - icon if cg_icon4class == 1 if(cg_icon4class.integer!=0) CG_DrawPic( 320 - w / 2 - 28, 164, 28, 28, cgs.media.limboClassButtons2[( (cg_entities[ cg.crosshairClientNum ].currentState.powerups >> PW_OPS_CLASS_1) & 7 )] ); if( cg_drawCrosshairNames.integer == 2) { // name without color CG_DrawSmallStringColor( 320 - w / 2, 170, s, color ); } else { // colored names CG_DrawStringExt( 320 - w / 2, 170, s, color, qfalse, qtrue, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); } (line 2627) **** REPLACE // determine player class playerClass = BG_ClassLetterForNumber( cg_entities[ cg.crosshairClientNum ].currentState.teamNum ); name = cgs.clientinfo[ cg.crosshairClientNum ].name; playerRank = cgs.clientinfo[cg.crosshairClientNum].team == TEAM_AXIS ? rankNames_Axis[cgs.clientinfo[cg.crosshairClientNum].rank] : rankNames_Allies[cgs.clientinfo[cg.crosshairClientNum].rank]; s = va( "[%s] %s %s", CG_TranslateString( playerClass ), playerRank, name ); w = CG_DrawStrlen( s ) * SMALLCHAR_WIDTH; // draw the name and class if( cg_drawCrosshairNames.integer == 2) { // name without color CG_DrawSmallStringColor( 320 - w / 2, 170, s, color ); } else { // colored names CG_DrawStringExt( 320 - w / 2, 170, s, color, qfalse, qtrue, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); } **** WITH // determine player class playerClass = BG_ClassLetterForNumber( cg_entities[ cg.crosshairClientNum ].currentState.teamNum ); name = cgs.clientinfo[ cg.crosshairClientNum ].name; playerRank = cgs.clientinfo[cg.crosshairClientNum].team == TEAM_AXIS ? rankNames_Axis[cgs.clientinfo[cg.crosshairClientNum].rank] : rankNames_Allies[cgs.clientinfo[cg.crosshairClientNum].rank]; // PatheticCockroach - icon if cg_icon4class == 1 if(cg_icon4class.integer==0) s = va( "[%s] %s %s", CG_TranslateString( playerClass ), playerRank, name ); else s = va( "%s %s", playerRank, name ); w = CG_DrawStrlen( s ) * SMALLCHAR_WIDTH; // draw the name and class // PatheticCockroach - icon if cg_icon4class == 1 if(cg_icon4class.integer!=0) CG_DrawPic( 320 - w / 2 - 28, 164, 28, 28, cgs.media.limboClassButtons2[( cg_entities[ cg.crosshairClientNum ].currentState.teamNum )] ); if( cg_drawCrosshairNames.integer == 2) { // name without color CG_DrawSmallStringColor( 320 - w / 2, 170, s, color ); } else { // colored names CG_DrawStringExt( 320 - w / 2, 170, s, color, qfalse, qtrue, SMALLCHAR_WIDTH, SMALLCHAR_HEIGHT, 0 ); } etmain\ui\etpub_customize_config.menu (line 44) **** AFTER MULTI( 8, 96, (SUBWINDOW_WIDTH)-4, 10, "Console Logging:", .2, 8, "cg_logConsole", cvarFloatList {"No" 0 "Centerprints" 1 "Banners" 2 "Center + Banners" 3}, "What should be logged to your console" ) **** ADD SUBWINDOW( 6, 112, (SUBWINDOW_WIDTH), 36, "ETPub PCR alpha hacks" ) MULTI( 8, 128, (SUBWINDOW_WIDTH)-4, 10, "Class display:", .2, 8, "cg_icon4class", cvarFloatList { "Text" 0 "Icons" 1 }, "How player classes are reported in the scoreboard and in-game" ) ------------------------- PERSONAL NOTES BG_ShortClassnameForNumber CG_DrawPic( tempx - 3, y + 1, 14, 14, cgs.media.scoreEliminatedShader ); (14 and 14 are size) // OSP - allow MV clients see the class of its merged client's on the scoreboard else if ( cg.snap->ps.persistant[PERS_TEAM] == ci->team || CG_mvMergedClientLocate(score->client) ) { CG_DrawSmallString( tempx, y, CG_TranslateString( BG_ShortClassnameForNumber( score->playerClass ) ), fade ); } cgs.media.skillPics[SK_BATTLE_SENSE] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_battlesense" ); cgs.media.skillPics[SK_EXPLOSIVES_AND_CONSTRUCTION] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_engineer" ); cgs.media.skillPics[SK_FIRST_AID] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_medic" ); cgs.media.skillPics[SK_SIGNALS] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_fieldops" ); cgs.media.skillPics[SK_LIGHT_WEAPONS] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_lightweap" ); cgs.media.skillPics[SK_HEAVY_WEAPONS] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_soldier" ); cgs.media.skillPics[SK_MILITARY_INTELLIGENCE_AND_SCOPED_WEAPONS] = trap_R_RegisterShaderNoMip( "gfx/limbo/ic_covertops" ); cgs.media.limboClassButtons2[PC_ENGINEER] = trap_R_RegisterShaderNoMip( "gfx/limbo/skill_engineer" ); cgs.media.limboClassButtons2[PC_SOLDIER] = trap_R_RegisterShaderNoMip( "gfx/limbo/skill_soldier" ); cgs.media.limboClassButtons2[PC_COVERTOPS] = trap_R_RegisterShaderNoMip( "gfx/limbo/skill_covops" ); cgs.media.limboClassButtons2[PC_FIELDOPS] = trap_R_RegisterShaderNoMip( "gfx/limbo/skill_fieldops" ); cgs.media.limboClassButtons2[PC_MEDIC] = trap_R_RegisterShaderNoMip( "gfx/limbo/skill_medic" ); et pour les fonctions de dessin d'icône, voir avant les b031