I'm confused. I took a look at the code to see if there was a quick fix:
void CheckForBonusPoints (void)
{
edict_t *flag = NULL;
qboolean needs_overtime;
needs_overtime = GameNeedsOvertime(); // 1.831
while ((flag = G_Find(flag, FOFS(classname), ITEM_SCORE_STRING)))
{
if (flag->teamnumber == 0)
continue;
// Flag must be owned, and belong to a team with no players.
if (flag->owner && (!GetLivingPlayersOnTeam(flag->teamnumber) || (GameIsGameOver() && !needs_overtime))) // 1.831
{
{
char LOGping[256];
char LOGtime[256];
strcpy(LOGtime, va("%i", (int)level.time));
strcpy(LOGping, va("%i", (int)flag->owner->client->ping));
PrintToLog(flag->owner->client->pers.netname, NULL, "FlagBONUS", NULL, "3", LOGtime, LOGping, 1);
}
safe_bprintf(PRINT_HIGH,"%c%s's %s earned 2 points for possesion of eliminated teams flag!\n",
splat(flag->owner->teamnumber),
TeamsGetName(TeamsGetTeam(flag->owner)),
flag->owner->client->pers.netname);
flag->owner->client->resp.flagretsscore += 2;
TeamsAdjustScore(TeamsGetTeam(flag->owner), 2);
if (!GameIsRoundOver()) // 1.80 - so flag doesn't show up at round end when someone is carrying it
{
DropCtfFlags(flag->owner, flag->teamnumber); // 1.80
MakeTouchable(flag); // Only make flag appear at base if there are other teams alive
}
flag->pickuptime = level.time;
flag->nextthink = 0;
flag->think = NULL;
flag->owner = NULL;
flag->nextdo = 0;
flag->pbitem = 1; // TODO Move this to SP function
if (flag->origin1[0] != 0 || flag->origin1[1] != 0 || flag->origin1[2] != 0)
{
VectorCopy(flag->origin1, flag->s.origin);
flag->s.event = EV_OTHER_TELEPORT;
}
}
}
}
I don't see how it's possible for somebody to get credit for just 1 flag. It loops through all the flags before anything else ever happens in the game, unless you were playing on a server with the old version before I fixed the bug (it used to have GameNeedsOvertime() in the loop, I believe). What server was this on, and what version was it running?