// TAT 11/6/2002 // Local func to actual do skill upgrade, used by both MP skill system, and SP scripted skill system static void G_UpgradeSkill( gentity_t *ent, skillType_t skill ) { int i, cnt = 0; // See if this is the first time we've reached this skill level for( i = 0; i < SK_NUM_SKILLS; i++ ) { if( i == skill ) continue; if( ent->client->sess.skill[skill] <= ent->client->sess.skill[i] ) break; } G_DebugAddSkillLevel( ent, skill ); if( i == SK_NUM_SKILLS ) { // increase rank ent->client->sess.rank++; } if( ent->client->sess.rank >=4 ) { // Gordon: count the number of maxed out skills for( i = 0; i < SK_NUM_SKILLS; i++ ) { if( ent->client->sess.skill[ i ] >= 4 ) { cnt++; } } ent->client->sess.rank = cnt + 3; if( ent->client->sess.rank > 10 ) { ent->client->sess.rank = 10; } } ClientUserinfoChanged( ent-g_entities ); // Give em rightaway if( skill == SK_BATTLE_SENSE && ent->client->sess.skill[skill] == 1 ) { if( AddWeaponToPlayer( ent->client, WP_BINOCULARS, 1, 0, qfalse ) ) { ent->client->ps.stats[STAT_KEYS] |= ( 1 << INV_BINOCS ); } } else if( skill == SK_FIRST_AID && ent->client->sess.playerType == PC_MEDIC && ent->client->sess.skill[skill] == 4 ) { AddWeaponToPlayer( ent->client, WP_MEDIC_ADRENALINE, ent->client->ps.ammo[BG_FindAmmoForWeapon(WP_MEDIC_ADRENALINE)], ent->client->ps.ammoclip[BG_FindClipForWeapon(WP_MEDIC_ADRENALINE)], qfalse ); } }
/** * @brief Local func to actual do skill upgrade, used by both MP skill system, and SP scripted skill system * @param[in,out] ent * @param[in] skill */ void G_UpgradeSkill(gentity_t *ent, skillType_t skill) { int i; #ifdef FEATURE_LUA // *LUA* API callbacks if (G_LuaHook_UpgradeSkill(g_entities - ent, skill)) { return; } #endif // See if this is the first time we've reached this skill level for (i = 0; i < SK_NUM_SKILLS; i++) { if (i == skill) { continue; } if (ent->client->sess.skill[skill] <= ent->client->sess.skill[i]) { break; } } G_DebugAddSkillLevel(ent, skill); #ifdef FEATURE_RATING if (g_skillRating.integer) { ent->client->sess.rank = (int)(MAX(ent->client->sess.mu - 3 * ent->client->sess.sigma, 0.f) / (2 * MU) * NUM_EXPERIENCE_LEVELS); if (ent->client->sess.rank > 10) { ent->client->sess.rank = 10; } } else { #endif if (i == SK_NUM_SKILLS) { // increase rank ent->client->sess.rank++; } if (ent->client->sess.rank >= 4) { int cnt = 0; // count the number of maxed out skills for (i = 0; i < SK_NUM_SKILLS; i++) { if (ent->client->sess.skill[i] >= 4) { cnt++; } } ent->client->sess.rank = cnt + 3; if (ent->client->sess.rank > 10) { ent->client->sess.rank = 10; } } #ifdef FEATURE_RATING } #endif ClientUserinfoChanged(ent - g_entities); // Give em rightaway if (skill == SK_BATTLE_SENSE && ent->client->sess.skill[skill] == 1) { AddWeaponToPlayer(ent->client, WP_BINOCULARS, 1, 0, qfalse); ent->client->ps.stats[STAT_KEYS] |= (1 << INV_BINOCS); } else if (skill == SK_FIRST_AID && ent->client->sess.playerType == PC_MEDIC && ent->client->sess.skill[skill] == 4) { AddWeaponToPlayer(ent->client, WP_MEDIC_ADRENALINE, ent->client->ps.ammo[GetWeaponTableData(WP_MEDIC_ADRENALINE)->ammoIndex], ent->client->ps.ammoclip[GetWeaponTableData(WP_MEDIC_ADRENALINE)->clipIndex], qfalse); } }
/* =========== SetWolfSpawnWeapons =========== */ void SetWolfSpawnWeapons(gclient_t *client) { int pc = client->sess.playerType; if (client->sess.sessionTeam == TEAM_SPECTATOR) { return; } // Reset special weapon time client->ps.classWeaponTime = -999999; // Communicate it to cgame client->ps.stats[STAT_PLAYER_CLASS] = pc; // Abuse teamNum to store player class as well (can't see stats for all clients in cgame) client->ps.teamNum = pc; // JPW NERVE -- zero out all ammo counts memset(client->ps.ammo, 0, MAX_WEAPONS * sizeof (int)); // All players start with a knife (not OR-ing so that it clears previous weapons) client->ps.weapons[0] = 0; client->ps.weapons[1] = 0; AddWeaponToPlayer(client, WP_KNIFE, 1, 0, qtrue); client->ps.weaponstate = WEAPON_READY; // Nico, give binoculars to everyone if (AddWeaponToPlayer(client, WP_BINOCULARS, 1, 0, qfalse)) { client->ps.stats[STAT_KEYS] |= (1 << INV_BINOCS); } if (pc == PC_ENGINEER) { // Nico, give pliers AddWeaponToPlayer(client, WP_PLIERS, 0, 1, qfalse); if (client->sess.sessionTeam == TEAM_AXIS) { switch (client->sess.playerWeapon) { case WP_KAR98: AddWeaponToPlayer(client, WP_KAR98, GetAmmoTableData(WP_KAR98)->defaultStartingAmmo, GetAmmoTableData(WP_KAR98)->defaultStartingClip, qtrue); break; default: AddWeaponToPlayer(client, WP_MP40, GetAmmoTableData(WP_MP40)->defaultStartingAmmo, GetAmmoTableData(WP_MP40)->defaultStartingClip, qtrue); break; } } else { switch (client->sess.playerWeapon) { case WP_CARBINE: AddWeaponToPlayer(client, WP_CARBINE, GetAmmoTableData(WP_CARBINE)->defaultStartingAmmo, GetAmmoTableData(WP_CARBINE)->defaultStartingClip, qtrue); break; default: AddWeaponToPlayer(client, WP_THOMPSON, GetAmmoTableData(WP_THOMPSON)->defaultStartingAmmo, GetAmmoTableData(WP_THOMPSON)->defaultStartingClip, qtrue); break; } } } else if (pc == PC_FIELDOPS) { if (client->sess.sessionTeam == TEAM_AXIS) { AddWeaponToPlayer(client, WP_MP40, GetAmmoTableData(WP_MP40)->defaultStartingAmmo, GetAmmoTableData(WP_MP40)->defaultStartingClip, qtrue); } else { AddWeaponToPlayer(client, WP_THOMPSON, GetAmmoTableData(WP_THOMPSON)->defaultStartingAmmo, GetAmmoTableData(WP_THOMPSON)->defaultStartingClip, qtrue); } } else if (pc == PC_MEDIC) { AddWeaponToPlayer(client, WP_MEDKIT, GetAmmoTableData(WP_MEDKIT)->defaultStartingAmmo, GetAmmoTableData(WP_MEDKIT)->defaultStartingClip, qfalse); if (client->sess.sessionTeam == TEAM_AXIS) { AddWeaponToPlayer(client, WP_MP40, 0, GetAmmoTableData(WP_MP40)->defaultStartingClip, qtrue); } else { AddWeaponToPlayer(client, WP_THOMPSON, 0, GetAmmoTableData(WP_THOMPSON)->defaultStartingClip, qtrue); } } else if (pc == PC_SOLDIER) { switch (client->sess.sessionTeam) { case TEAM_AXIS: /* Nico, #todo rocket runs support switch ( client->sess.playerWeapon ) { default: case WP_FLAMETHROWER: case WP_MOBILE_MG42: case WP_MORTAR: case WP_MP40:*/ AddWeaponToPlayer(client, WP_MP40, GetAmmoTableData(WP_MP40)->defaultStartingAmmo, GetAmmoTableData(WP_MP40)->defaultStartingClip, qtrue); /*break; case WP_PANZERFAUST: AddWeaponToPlayer( client, WP_PANZERFAUST, GetAmmoTableData( WP_PANZERFAUST )->defaultStartingAmmo, GetAmmoTableData( WP_PANZERFAUST )->defaultStartingClip, qtrue ); break; } break;*/ case TEAM_ALLIES: /* Nico, #todo rocket runs support switch ( client->sess.playerWeapon ) { default: // Nico, replaced weapons case WP_FLAMETHROWER: case WP_MOBILE_MG42: case WP_MORTAR: case WP_THOMPSON:*/ AddWeaponToPlayer(client, WP_THOMPSON, GetAmmoTableData(WP_THOMPSON)->defaultStartingAmmo, GetAmmoTableData(WP_THOMPSON)->defaultStartingClip, qtrue); /*break; case WP_PANZERFAUST: AddWeaponToPlayer( client, WP_PANZERFAUST, GetAmmoTableData( WP_PANZERFAUST )->defaultStartingAmmo, GetAmmoTableData( WP_PANZERFAUST )->defaultStartingClip, qtrue ); break; } break;*/ default: break; } } else if (pc == PC_COVERTOPS) { switch (client->sess.playerWeapon) { case WP_K43: case WP_GARAND: if (client->sess.sessionTeam == TEAM_AXIS) { if (AddWeaponToPlayer(client, WP_K43, GetAmmoTableData(WP_K43)->defaultStartingAmmo, GetAmmoTableData(WP_K43)->defaultStartingClip, qtrue)) { AddWeaponToPlayer(client, WP_K43_SCOPE, GetAmmoTableData(WP_K43_SCOPE)->defaultStartingAmmo, GetAmmoTableData(WP_K43_SCOPE)->defaultStartingClip, qfalse); } break; } else { if (AddWeaponToPlayer(client, WP_GARAND, GetAmmoTableData(WP_GARAND)->defaultStartingAmmo, GetAmmoTableData(WP_GARAND)->defaultStartingClip, qtrue)) { AddWeaponToPlayer(client, WP_GARAND_SCOPE, GetAmmoTableData(WP_GARAND_SCOPE)->defaultStartingAmmo, GetAmmoTableData(WP_GARAND_SCOPE)->defaultStartingClip, qfalse); } break; } case WP_FG42: if (AddWeaponToPlayer(client, WP_FG42, GetAmmoTableData(WP_FG42)->defaultStartingAmmo, GetAmmoTableData(WP_FG42)->defaultStartingClip, qtrue)) { AddWeaponToPlayer(client, WP_FG42SCOPE, GetAmmoTableData(WP_FG42SCOPE)->defaultStartingAmmo, GetAmmoTableData(WP_FG42SCOPE)->defaultStartingClip, qfalse); } break; default: AddWeaponToPlayer(client, WP_STEN, GetAmmoTableData(WP_STEN)->defaultStartingAmmo, GetAmmoTableData(WP_STEN)->defaultStartingClip, qtrue); break; } } // Nico, note: pistols are given here switch (client->sess.sessionTeam) { case TEAM_AXIS: switch (pc) { case PC_SOLDIER: AddWeaponToPlayer(client, WP_LUGER, GetAmmoTableData(WP_LUGER)->defaultStartingAmmo, GetAmmoTableData(WP_LUGER)->defaultStartingClip, qfalse); break; case PC_COVERTOPS: AddWeaponToPlayer(client, WP_LUGER, GetAmmoTableData(WP_LUGER)->defaultStartingAmmo, GetAmmoTableData(WP_LUGER)->defaultStartingClip, qfalse); AddWeaponToPlayer(client, WP_SILENCER, GetAmmoTableData(WP_SILENCER)->defaultStartingAmmo, GetAmmoTableData(WP_SILENCER)->defaultStartingClip, qfalse); client->pmext.silencedSideArm = 1; break; default: AddWeaponToPlayer(client, WP_LUGER, GetAmmoTableData(WP_LUGER)->defaultStartingAmmo, GetAmmoTableData(WP_LUGER)->defaultStartingClip, qfalse); break; } break; default: switch (pc) { case PC_SOLDIER: AddWeaponToPlayer(client, WP_COLT, GetAmmoTableData(WP_COLT)->defaultStartingAmmo, GetAmmoTableData(WP_COLT)->defaultStartingClip, qfalse); break; case PC_COVERTOPS: AddWeaponToPlayer(client, WP_COLT, GetAmmoTableData(WP_COLT)->defaultStartingAmmo, GetAmmoTableData(WP_COLT)->defaultStartingClip, qfalse); AddWeaponToPlayer(client, WP_SILENCED_COLT, GetAmmoTableData(WP_SILENCED_COLT)->defaultStartingAmmo, GetAmmoTableData(WP_SILENCED_COLT)->defaultStartingClip, qfalse); client->pmext.silencedSideArm = 1; break; default: AddWeaponToPlayer(client, WP_COLT, GetAmmoTableData(WP_COLT)->defaultStartingAmmo, GetAmmoTableData(WP_COLT)->defaultStartingClip, qfalse); break; } } }