I found these fragments, but I’m not shure where to edit the source exactly. It’s too complicated for beginner (I have been programming since three days :D). I think you are able to help me.
Here I am sharing three interesting functions.
weapon_t G_GetPrimaryWeaponForClient( gclient_t *client )
{
int i;
bg_playerclass_t *classInfo;
if( client->sess.sessionTeam != TEAM_ALLIES && client->sess.sessionTeam != TEAM_AXIS ) {
return WP_NONE;
}
if( client->sess.skill[SK_HEAVY_WEAPONS] < 4 ) {
if( COM_BitCheck( client->ps.weapons, WP_THOMPSON ) )
return WP_THOMPSON;
if( COM_BitCheck( client->ps.weapons, WP_MP40 ) )
return WP_MP40;
}
classInfo = &bg_allies_playerclasses[client->sess.playerType];
for( i = 0; i < MAX_WEAPS_PER_CLASS; i++) {
if( classInfo->classWeapons[i] == WP_MP40 || classInfo->classWeapons[i] == WP_THOMPSON )
continue;
if( COM_BitCheck( client->ps.weapons, classInfo->classWeapons[i] ) ) {
return classInfo->classWeapons[i];
}
}
classInfo = &bg_axis_playerclasses[client->sess.playerType];
for( i = 0; i < MAX_WEAPS_PER_CLASS; i++) {
if( classInfo->classWeapons[i] == WP_MP40 || classInfo->classWeapons[i] == WP_THOMPSON )
continue;
if( COM_BitCheck( client->ps.weapons, classInfo->classWeapons[i] ) ) {
return classInfo->classWeapons[i];
}
}
return WP_NONE;
}
qboolean G_CanPickupWeapon( weapon_t weapon, gentity_t* ent ) {
if( ent->client->sess.sessionTeam == TEAM_AXIS ) {
if( weapon == WP_THOMPSON ) {
weapon = WP_MP40;
} else if( weapon == WP_CARBINE ) {
weapon = WP_KAR98;
} else if( weapon == WP_GARAND ) {
weapon = WP_K43;
}
} else if( ent->client->sess.sessionTeam == TEAM_ALLIES ) {
if( weapon == WP_MP40 ) {
weapon = WP_THOMPSON;
} else if( weapon == WP_KAR98 ) {
weapon = WP_CARBINE;
} else if( weapon == WP_K43 ) {
weapon = WP_GARAND;
}
}
if( ent->client->sess.skill[SK_HEAVY_WEAPONS] >= 4 && ( weapon == WP_THOMPSON || weapon == WP_MP40 ) ) {
return qfalse;
}
return BG_WeaponIsPrimaryForClassAndTeam( ent->client->sess.playerType, ent->client->sess.sessionTeam, weapon );
}
int Pickup_Weapon( gentity_t *ent, gentity_t *other ) {
int quantity;
qboolean alreadyHave = qfalse;
// JPW NERVE -- magic ammo for any two-handed weapon
if( ent->item->giTag == WP_AMMO ) {
AddMagicAmmo( other, ent->count );
// if LT isn't giving ammo to self or another LT or the enemy, give him some props
if( other->client->ps.stats[STAT_PLAYER_CLASS] != PC_FIELDOPS ) {
if ( ent->parent && ent->parent->client && other->client->sess.sessionTeam == ent->parent->client->sess.sessionTeam ) {
if (!(ent->parent->client->PCSpecialPickedUpCount % LT_SPECIAL_PICKUP_MOD)) {
AddScore(ent->parent, WOLF_AMMO_UP);
if(ent->parent && ent->parent->client) {
G_LogPrintf("Ammo_Pack: %d %d
", ent->parent - g_entities, other - g_entities); // OSP
}
}
ent->parent->client->PCSpecialPickedUpCount++;
G_AddSkillPoints( ent->parent, SK_SIGNALS, 1.f );
G_DebugAddSkillPoints( ent->parent, SK_SIGNALS, 1.f, "ammo pack picked up" );
// extracted code originally here into AddMagicAmmo -xkan, 9/18/2002
// add 1 clip of magic ammo for any two-handed weapon
}
return RESPAWN_SP;
}
}
quantity = ent->count;
// check if player already had the weapon
alreadyHave = COM_BitCheck( other->client->ps.weapons, ent->item->giTag );
// JPW NERVE prevents drop/pickup weapon "quick reload" exploit
if( alreadyHave ) {
Add_Ammo( other, ent->item->giTag, quantity, qfalse );
// Gordon: secondary weapon ammo
if( ent->delay ) {
Add_Ammo( other, weapAlts[ ent->item->giTag ], ent->delay, qfalse );
}
} else {
if( level.time - other->client->dropWeaponTime < 1000 ) {
return 0;
}
if( other->client->ps.weapon == WP_MORTAR_SET || other->client->ps.weapon == WP_MOBILE_MG42_SET ) {
return 0;
}
// See if we can pick it up
if( G_CanPickupWeapon( ent->item->giTag, other ) ) {
weapon_t primaryWeapon = G_GetPrimaryWeaponForClient( other->client );
// rain - added parens around ambiguous &&
if( primaryWeapon ||
(other->client->sess.playerType == PC_SOLDIER && other->client->sess.skill[SK_HEAVY_WEAPONS] >= 4) ) {
if( primaryWeapon ) {
// drop our primary weapon
G_DropWeapon( other, primaryWeapon );
}
// now pickup the other one
other->client->dropWeaponTime = level.time;
// add the weapon
COM_BitSet( other->client->ps.weapons, ent->item->giTag );
// DHM - Fixup mauser/sniper issues
if( ent->item->giTag == WP_FG42 ) {
COM_BitSet( other->client->ps.weapons, WP_FG42SCOPE);
} else if(ent->item->giTag == WP_GARAND) {
COM_BitSet( other->client->ps.weapons, WP_GARAND_SCOPE);
} else if( ent->item->giTag == WP_K43 ) {
COM_BitSet( other->client->ps.weapons, WP_K43_SCOPE );
} else if( ent->item->giTag == WP_MORTAR ) {
COM_BitSet( other->client->ps.weapons, WP_MORTAR_SET );
} else if( ent->item->giTag == WP_MOBILE_MG42 ) {
COM_BitSet( other->client->ps.weapons, WP_MOBILE_MG42_SET );
} else if( ent->item->giTag == WP_CARBINE ) {
COM_BitSet( other->client->ps.weapons, WP_M7 );
} else if( ent->item->giTag == WP_KAR98 ) {
COM_BitSet( other->client->ps.weapons, WP_GPG40 );
}
other->client->ps.ammoclip[BG_FindClipForWeapon(ent->item->giTag)] = 0;
other->client->ps.ammo[BG_FindAmmoForWeapon(ent->item->giTag)] = 0;
if( ent->item->giTag == WP_MORTAR ) {
other->client->ps.ammo[BG_FindClipForWeapon(ent->item->giTag)] = quantity;
// Gordon: secondary weapon ammo
if( ent->delay ) {
Add_Ammo( other, weapAlts[ ent->item->giTag ], ent->delay, qfalse );
}
} else {
other->client->ps.ammoclip[BG_FindClipForWeapon(ent->item->giTag)] = quantity;
// Gordon: secondary weapon ammo
if( ent->delay ) {
other->client->ps.ammo[ weapAlts[ ent->item->giTag ] ] = ent->delay;
}
}
}
} else {
return 0;
}
}
// TAT 1/6/2003 - If we are a bot, call the pickup function
if( other->r.svFlags & SVF_BOT )
BotPickupWeapon( other->s.number, ent->item->giTag, alreadyHave );
return -1;
}