Tutorial: Become a new Weapons when u reach Medic Skill Level 4 and/or Engi Skill Level 4:
(Etpub 0.91 / Chaos 0.1.5)
File: cgame/cg_limbopanel.c
In:
void CG_LimboPanel_WeaponPanel( panel_button_t* button ) {
Search:
	// render in expanded mode ^
	for( i = 0, x = 1; i < cnt; i++ ) {
		weapon_t cycleWeap = CG_LimboPanel_GetWeaponForNumber( i, cgs.ccSelectedWeaponNumber, qtrue );
		if( cycleWeap != weap ) {
			CG_LimboPanel_WeaponPanel_DrawWeapon( &rect, cycleWeap, qtrue, va( "%iof%i", i+1, cnt ), CG_LimboPanel_RealWeaponIsDisabled( cycleWeap ) );
			if( BG_CursorInRect( &rect ) ) {
				if( button->data[7] != x ) {
					SOUND_FOCUS;
					button->data[7] = x;
				}
			}
			rect.y -= rect.h;
			x++;
		}
	}
Change it with:
	// render in expanded mode ^
	for( i = 0, x = 1; i < cnt; i++ ) {
		weapon_t cycleWeap = CG_LimboPanel_GetWeaponForNumber( i, cgs.ccSelectedWeaponNumber, qtrue );
		if( cycleWeap != weap && (
			cycleWeap != WP_SHOTGUN || cycleWeap != WP_PPS43 || 
			cgs.clientinfo[cg.clientNum].skill[sK_EXPLOSIVES_AND_CONSTRUCTION] >= 5 ||
			cgs.clientinfo[cg.clientNum].skill[sK_FIRST_AID] >= 5)) {
			CG_LimboPanel_WeaponPanel_DrawWeapon( &rect, cycleWeap, qtrue, va( "%iof%i", i+1, cnt ), CG_LimboPanel_RealWeaponIsDisabled( cycleWeap ) );
			if( BG_CursorInRect( &rect ) ) {
				if( button->data[7] != x ) {
					SOUND_FOCUS;
					button->data[7] = x;
				}
			}
			rect.y -= rect.h;
			x++;
		}
	}
...
Search:
int CG_LimboPanel_WeaponCount_ForSlot( int number ) {
if( number == 1 ) {
	bg_playerclass_t* classInfo = CG_LimboPanel_GetPlayerClass();
	int cnt = 0, i;
	for(i = 0; i < MAX_WEAPS_PER_CLASS; i++) {
		if( !classInfo->classWeapons[i] ) {
			break;
		}
		cnt++;
	}
	return cnt;
} else {
	if( cgs.clientinfo[cg.clientNum].skill[sK_HEAVY_WEAPONS] >= 4 && CG_LimboPanel_GetClass() == PC_SOLDIER ) {
		if( cgs.clientinfo[cg.clientNum].skill[sK_LIGHT_WEAPONS] >= 4 ) {
			return 3;
		} else {
			return 2;
		}
	} else {
		if( cgs.clientinfo[cg.clientNum].skill[sK_LIGHT_WEAPONS] >= 4 ) {
			return 2;
		} else {
			return 1;
		}
	}
}
}
Change it with:
int CG_LimboPanel_WeaponCount_ForSlot( int number ) {
if( number == 1 ) {
	bg_playerclass_t* classInfo = CG_LimboPanel_GetPlayerClass();
	int cnt = 0, i;
	for(i = 0; i < MAX_WEAPS_PER_CLASS; i++) {
		if( !classInfo->classWeapons[i] ) {
			break;
		}
		
		// dont count Shotgun if disabled
		if (classInfo->classWeapons[i] == WP_SHOTGUN && !( cgs.clientinfo[cg.clientNum].skill[sK_EXPLOSIVES_AND_CONSTRUCTION] >= 5 ))
			continue;
		if ( classInfo->classWeapons[i] == WP_PPS43 && !( cgs.clientinfo[cg.clientNum].skill[sK_FIRST_AID] >= 5 ))
			continue;
			
		cnt++;
	}
	return cnt;
} else {
	if( cgs.clientinfo[cg.clientNum].skill[sK_HEAVY_WEAPONS] >= 4 && CG_LimboPanel_GetClass() == PC_SOLDIER ) {
		if( cgs.clientinfo[cg.clientNum].skill[sK_LIGHT_WEAPONS] >= 4 ) {
			return 3;
		} else {
			return 2;
		}
	} else {
		if( cgs.clientinfo[cg.clientNum].skill[sK_LIGHT_WEAPONS] >= 4 ) {
			return 2;
		} else {
			return 1;
		}
	}
}
}
File: game/bg_classes.c
Search PC_Medic and PC_Engineer
Add then the weapon, but they must to be the last weapons!
Dont forgott to make these on Axis and Allied!!!!
{
	PC_MEDIC,
	"characters/temperate/allied/medic.char",
	"ui/assets/mp_health_blue.tga",
	"ui/assets/mp_arrow_blue.tga",
	{ 
		WP_THOMPSON,
		WP_M3A1,
		WP_PPS43 //must to be the last weapon
	},	
},
{
	PC_ENGINEER,
	"characters/temperate/allied/engineer.char",
	"ui/assets/mp_wrench_blue.tga",
	"ui/assets/mp_arrow_blue.tga",
	{ 
		WP_THOMPSON,
		WP_CARBINE,
		WP_M3A1,
		WP_BREN,
		WP_SHOTGUN //must to be the last weapon
	},	
},
File: game/g_client.c
These will fix the /class e 5 2 command
qboolean _SetMedicSpawnWeapons(gclient_t *client) 
{
weapon_t w;
weapon_t w2;
w = client->sess.latchPlayerWeapon;
if(client->sess.sessionTeam == TEAM_AXIS) {
	switch(w) {
		case WP_PPS43:
			if( client->sess.skill[sK_FIRST_AID] <= 4 ) //If Skill Level 5 reached: Allow ppsh43
				w = WP_MP40;
			break;
		case WP_MP44:
		case WP_MP40:
		case WP_M3A1:
			break;
		default:
			w = WP_MP40;
	}
	AddWeaponToPlayer(client, WP_GRENADE_LAUNCHER, 0, 1, qfalse);
	w2 = G_BestSecWeaponForClient( client );
	if( w2 == WP_AKIMBO_LUGER && 
			(g_medics.integer & MEDIC_NOAKIMBO) ) {
		w2 = WP_LUGER;
	}
}
else if(client->sess.sessionTeam == TEAM_ALLIES) {
	switch(w) {
		case WP_PPS43:
			if( client->sess.skill[sK_FIRST_AID] <= 4 ) //If Skill Level 5 reached: Allow ppsh43
				w = WP_THOMPSON;
			break;
		case WP_BAR:
		case WP_THOMPSON:
		case WP_M3A1:
			break;
		default:
			w = WP_THOMPSON;
	}
	AddWeaponToPlayer(client, WP_GRENADE_PINEAPPLE, 0, 1, qfalse);	
	w2 = G_BestSecWeaponForClient( client );
	if( w2 == WP_AKIMBO_COLT && 
			(g_medics.integer & MEDIC_NOAKIMBO) ) {
....
qboolean _SetEngineerSpawnWeapons(gclient_t *client) 
{
weapon_t w = client->sess.latchPlayerWeapon;
weapon_t w2 = G_BestSecWeaponForClient( client );
if(client->sess.sessionTeam == TEAM_AXIS) {
	switch(w) {
		case WP_SHOTGUN:
			if( client->sess.skill[sK_EXPLOSIVES_AND_CONSTRUCTION] <= 4 ) //If Skill Level 5 reached: Allow Shotgun
				w = WP_MP40;
			break;
		case WP_KAR98:
		case WP_MP40:
		case WP_M3A1:
		case WP_BREN:
			break;
	default:
		w = WP_MP40;
	}
	AddWeaponToPlayer(client, WP_GRENADE_LAUNCHER, 0, 4, qfalse);	
} else if(client->sess.sessionTeam == TEAM_ALLIES) {
	switch(w) {
		case WP_SHOTGUN:
			if( client->sess.skill[sK_EXPLOSIVES_AND_CONSTRUCTION] <= 4 ) //If Skill Level 5 reached: Allow Shotgun
				w = WP_THOMPSON;
			break;
		case WP_CARBINE:
		case WP_THOMPSON:
		case WP_M3A1:
		case WP_BREN:
			break;
	default:
		w = WP_THOMPSON;
	}
	AddWeaponToPlayer(client, WP_GRENADE_PINEAPPLE, 0, 4, qfalse);
} else {
	return qfalse;
}
Credits: Nq-Mod and Chaos-Mod