/* ======================================================================================================================================= ObeliskDie ======================================================================================================================================= */ static void ObeliskDie(gentity_t *self, gentity_t *inflictor, gentity_t *attacker, int damage, int mod) { int otherTeam; otherTeam = OtherTeam(self->spawnflags); self->takedamage = qfalse; self->think = ObeliskRespawn; self->nextthink = level.time + g_obeliskRespawnDelay.integer * 1000; self->activator->s.modelindex2 = 0xff; self->activator->s.frame = 2; G_AddEvent(self->activator, EV_OBELISKEXPLODE, 0); if (self->spawnflags == attacker->client->sess.sessionTeam) { AddScore(attacker, self->r.currentOrigin, -CTF_CAPTURE_BONUS); } else { AddScore(attacker, self->r.currentOrigin, CTF_CAPTURE_BONUS); attacker->client->rewardTime = level.time + REWARD_TIME; attacker->client->ps.persistant[PERS_CAPTURES]++; } AddTeamScore(self->s.pos.trBase, otherTeam, 1); CalculateRanks(); Team_CaptureFlagSound(self, self->spawnflags); Team_ForceGesture(otherTeam); teamgame.redObeliskAttackedTime = 0; teamgame.blueObeliskAttackedTime = 0; trap_SendServerCommand(-1, va("cp \"%s" S_COLOR_WHITE "\ndestroyed the %s obelisk!\n\"", attacker->client->pers.netname, TeamName(self->spawnflags))); }
static void ObeliskDie(Gentity *self, Gentity *inflictor, Gentity *attacker, int damage, int mod) { int otherTeam; otherTeam = OtherTeam(self->spawnflags); AddTeamScore(self->s.pos.base, otherTeam, 1); Team_ForceGesture(otherTeam); CalculateRanks(); self->takedamage = qfalse; self->think = ObeliskRespawn; self->nextthink = level.time + g_obeliskRespawnDelay.integer * 1000; self->activator->s.modelindex2 = 0xff; self->activator->s.frame = 2; G_AddEvent(self->activator, EV_OBELISKEXPLODE, 0); AddScore(attacker, self->r.currentOrigin, CTF_CAPTURE_BONUS); /* add the sprite over the player's head */ attacker->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP); attacker->client->ps.eFlags |= EF_AWARD_CAP; attacker->client->rewardTime = level.time + REWARD_SPRITE_TIME; attacker->client->ps.persistant[PERS_CAPTURES]++; teamgame.redObeliskAttackedTime = 0; teamgame.blueObeliskAttackedTime = 0; }
/* ======================================================================================================================================= ObeliskTouch ======================================================================================================================================= */ static void ObeliskTouch(gentity_t *self, gentity_t *other, trace_t *trace) { int tokens; team_t otherTeam; if (!other->client) { return; } otherTeam = OtherTeam(other->client->sess.sessionTeam); if (otherTeam != self->spawnflags) { return; } tokens = other->client->ps.tokens; if (tokens <= 0) { return; } trap_SendServerCommand(-1, va("cp \"%s" S_COLOR_WHITE "\nbrought in %i %s %s!\n\"", other->client->pers.netname, tokens, TeamName(otherTeam), (tokens == 1) ? "skull" : "skulls")); other->client->rewardTime = level.time + REWARD_TIME; other->client->ps.persistant[PERS_CAPTURES] += tokens; other->client->ps.tokens = 0; AddScore(other, self->r.currentOrigin, CTF_CAPTURE_BONUS * tokens); AddTeamScore(self->s.pos.trBase, other->client->sess.sessionTeam, tokens); CalculateRanks(); Team_CaptureFlagSound(self, self->spawnflags); Team_ForceGesture(other->client->sess.sessionTeam); }
static void ObeliskTouch( gentity_t *self, gentity_t *other, trace_t *trace ) { int tokens; if ( !other->client ) { return; } if ( OtherTeam(other->client->sess.sessionTeam) != self->spawnflags ) { return; } tokens = other->client->ps.generic1; if( tokens <= 0 ) { return; } PrintMsg(NULL, "%s" S_COLOR_WHITE " brought in %i skull%s.\n", other->client->pers.netname, tokens, tokens ? "s" : "" ); AddTeamScore(self->s.pos.trBase, other->client->sess.sessionTeam, tokens); Team_ForceGesture(other->client->sess.sessionTeam); AddScore(other, self->r.currentOrigin, CTF_CAPTURE_BONUS*tokens); // add the sprite over the player's head other->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP ); other->client->ps.eFlags |= EF_AWARD_CAP; other->client->rewardTime = level.time + REWARD_SPRITE_TIME; other->client->ps.persistant[PERS_CAPTURES] += tokens; other->client->ps.generic1 = 0; CalculateRanks(); Team_CaptureFlagSound( self, self->spawnflags ); }
LTBOOL CTeamMgr::AddTeamScore(char* sTeamName, int nScore) { // Get the team... CTeam* pTeam = GetTeam(sTeamName); if (!pTeam) return(NULL); // Add the score... return(AddTeamScore(pTeam, nScore)); }
LTBOOL CTeamMgr::AddTeamScore(uint32 dwTeamID, int nScore) { // Get the team... CTeam* pTeam = GetTeam(dwTeamID); if (!pTeam) return(NULL); // Add the score... return(AddTeamScore(pTeam, nScore)); }
/* ============ AddScore Adds score to both the player and his team ============ */ void AddScore( gentity_t *ent, vec3_t origin, int score ) { if ( !ent->player ) { return; } // no scoring during pre-match warmup if ( level.warmupTime ) { return; } // show score plum ScorePlum(ent, origin, score); // ent->player->ps.persistant[PERS_SCORE] += score; if ( g_gametype.integer == GT_TEAM ) { AddTeamScore( origin, ent->player->ps.persistant[PERS_TEAM], score ); } CalculateRanks(); }
int Team_TouchOurFlag( gentity_t *ent, gentity_t *other, int team ) { int i, num, j, enemyTeam; gentity_t *player; gclient_t *cl = other->client; int enemy_flag; vec3_t mins, maxs; int touch[MAX_GENTITIES]; gentity_t* enemy; float enemyDist, dist; if (cl->sess.sessionTeam == TEAM_RED) { enemy_flag = PW_BLUEFLAG; } else { enemy_flag = PW_REDFLAG; } if ( ent->flags & FL_DROPPED_ITEM ) { // hey, its not home. return it by teleporting it back //PrintMsg( NULL, "%s" S_COLOR_WHITE " returned the %s flag!\n", // cl->pers.netname, TeamName(team)); PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_RETURNED_FLAG); AddScore(other, ent->r.currentOrigin, CTF_RECOVERY_BONUS); other->client->pers.teamState.flagrecovery++; other->client->pers.teamState.lastreturnedflag = level.time; //ResetFlag will remove this entity! We must return zero Team_ReturnFlagSound(Team_ResetFlag(team), team); return 0; } // the flag is at home base. if the player has the enemy // flag, he's just won! if (!cl->ps.powerups[enemy_flag]) return 0; // We don't have the flag // fix: captures after timelimit hit could // cause game ending with tied score if ( level.intermissionQueued ) { return 0; } // check for enemy closer to grab the flag VectorSubtract( ent->s.pos.trBase, minFlagRange, mins ); VectorAdd( ent->s.pos.trBase, maxFlagRange, maxs ); num = trap_EntitiesInBox( mins, maxs, touch, MAX_GENTITIES ); dist = Distance(ent->s.pos.trBase, other->client->ps.origin); if (other->client->sess.sessionTeam == TEAM_RED){ enemyTeam = TEAM_BLUE; } else { enemyTeam = TEAM_RED; } for ( j=0 ; j<num ; j++ ) { enemy = (g_entities + touch[j]); if (!enemy || !enemy->inuse || !enemy->client){ continue; } //check if its alive if (enemy->health < 1) continue; // dead people can't pickup //ignore specs if (enemy->client->sess.sessionTeam == TEAM_SPECTATOR) continue; //check if this is enemy if ((enemy->client->sess.sessionTeam != TEAM_RED && enemy->client->sess.sessionTeam != TEAM_BLUE) || enemy->client->sess.sessionTeam != enemyTeam){ continue; } //check if enemy is closer to our flag than us enemyDist = Distance(ent->s.pos.trBase,enemy->client->ps.origin); if (enemyDist < dist){ // possible recursion is hidden in this, but // infinite recursion wont happen, because we cant // have a < b and b < a at the same time return Team_TouchEnemyFlag( ent, enemy, team ); } } //PrintMsg( NULL, "%s" S_COLOR_WHITE " captured the %s flag!\n", cl->pers.netname, TeamName(OtherTeam(team))); PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_CAPTURED_FLAG); cl->ps.powerups[enemy_flag] = 0; teamgame.last_flag_capture = level.time; teamgame.last_capture_team = team; // Increase the team's score AddTeamScore(ent->s.pos.trBase, other->client->sess.sessionTeam, 1); // Team_ForceGesture(other->client->sess.sessionTeam); //rww - don't really want to do this now. Mainly because performing a gesture disables your upper torso animations until it's done and you can't fire other->client->pers.teamState.captures++; other->client->rewardTime = level.time + REWARD_SPRITE_TIME; other->client->ps.persistant[PERS_CAPTURES]++; // other gets another 10 frag bonus AddScore(other, ent->r.currentOrigin, CTF_CAPTURE_BONUS); Team_CaptureFlagSound( ent, team ); // Ok, let's do the player loop, hand out the bonuses for (i = 0; i < sv_maxclients.integer; i++) { player = &g_entities[i]; if (!player->inuse || player == other) continue; if (player->client->sess.sessionTeam != cl->sess.sessionTeam) { player->client->pers.teamState.lasthurtcarrier = -5; } else if (player->client->sess.sessionTeam == cl->sess.sessionTeam) { AddScore(player, ent->r.currentOrigin, CTF_TEAM_BONUS); // award extra points for capture assists if (player->client->pers.teamState.lastreturnedflag + CTF_RETURN_FLAG_ASSIST_TIMEOUT > level.time) { AddScore (player, ent->r.currentOrigin, CTF_RETURN_FLAG_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } //Raz: Was 'else if' meaning people were missing out on some assist scores if (player->client->pers.teamState.lastfraggedcarrier + CTF_FRAG_CARRIER_ASSIST_TIMEOUT > level.time) { AddScore(player, ent->r.currentOrigin, CTF_FRAG_CARRIER_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } } } Team_ResetFlags(); CalculateRanks(); return 0; // Do not respawn this automatically }
/* * Team_DroppedFlagThink */ int Team_TouchOurFlag(Gentity *ent, Gentity *other, int team) { int i; Gentity *player; Gclient *cl = other->client; int enemy_flag; if(g_gametype.integer == GT_1FCTF) enemy_flag = PW_NEUTRALFLAG; else{ if(cl->sess.team == TEAM_RED) enemy_flag = PW_BLUEFLAG; else enemy_flag = PW_REDFLAG; if(ent->flags & FL_DROPPED_ITEM){ /* hey, it's not home. return it by teleporting it back */ PrintMsg(NULL, "%s" S_COLOR_WHITE " returned the %s flag!\n", cl->pers.netname, TeamName(team)); AddScore(other, ent->r.currentOrigin, CTF_RECOVERY_BONUS); other->client->pers.teamState.flagrecovery++; other->client->pers.teamState.lastreturnedflag = level.time; /* ResetFlag will remove this entity! We must return zero */ Team_ReturnFlagSound(Team_ResetFlag(team), team); return 0; } } /* the flag is at home base. if the player has the enemy * flag, he's just won! */ if(!cl->ps.powerups[enemy_flag]) return 0; /* We don't have the flag */ if(g_gametype.integer == GT_1FCTF) PrintMsg(NULL, "%s" S_COLOR_WHITE " captured the flag!\n", cl->pers.netname); else{ PrintMsg(NULL, "%s" S_COLOR_WHITE " captured the %s flag!\n", cl->pers.netname, TeamName(OtherTeam( team))); } cl->ps.powerups[enemy_flag] = 0; teamgame.last_flag_capture = level.time; teamgame.last_capture_team = team; /* Increase the team's score */ AddTeamScore(ent->s.traj.base, other->client->sess.team, 1); Team_ForceGesture(other->client->sess.team); other->client->pers.teamState.captures++; /* add the sprite over the player's head */ other->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP); other->client->ps.eFlags |= EF_AWARD_CAP; other->client->rewardTime = level.time + REWARD_SPRITE_TIME; other->client->ps.persistant[PERS_CAPTURES]++; /* other gets another 10 frag bonus */ AddScore(other, ent->r.currentOrigin, CTF_CAPTURE_BONUS); Team_CaptureFlagSound(ent, team); /* Ok, let's do the player loop, hand out the bonuses */ for(i = 0; i < g_maxclients.integer; i++){ player = &g_entities[i]; /* also make sure we don't award assist bonuses to the flag carrier himself. */ if(!player->inuse || player == other) continue; if(player->client->sess.team != cl->sess.team) player->client->pers.teamState.lasthurtcarrier = -5; else if(player->client->sess.team == cl->sess.team){ if(player != other) AddScore(player, ent->r.currentOrigin, CTF_TEAM_BONUS); /* award extra points for capture assists */ if(player->client->pers.teamState.lastreturnedflag + CTF_RETURN_FLAG_ASSIST_TIMEOUT > level.time){ AddScore (player, ent->r.currentOrigin, CTF_RETURN_FLAG_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT] ++; /* add the sprite over the player's head */ player->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP); player->client->ps.eFlags |= EF_AWARD_ASSIST; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } if(player->client->pers.teamState.lastfraggedcarrier + CTF_FRAG_CARRIER_ASSIST_TIMEOUT > level.time){ AddScore(player, ent->r.currentOrigin, CTF_FRAG_CARRIER_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT] ++; /* add the sprite over the player's head */ player->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP); player->client->ps.eFlags |= EF_AWARD_ASSIST; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } } } Team_ResetFlags(); CalculateRanks(); return 0; /* Do not respawn this automatically */ }
/* ======================================================================================================================================= Team_TouchOurFlag ======================================================================================================================================= */ int Team_TouchOurFlag(gentity_t *ent, gentity_t *other, int team) { int i; gentity_t *player; gclient_t *cl = other->client; int enemy_flag; if (g_gametype.integer == GT_1FCTF) { enemy_flag = PW_NEUTRALFLAG; } else { if (cl->sess.sessionTeam == TEAM_RED) { enemy_flag = PW_BLUEFLAG; } else { enemy_flag = PW_REDFLAG; } if (ent->flags & FL_DROPPED_ITEM) { // hey, it's not home. return it by teleporting it back PrintMsg(NULL, "%s" S_COLOR_WHITE " returned the %s flag!\n", cl->pers.netname, TeamName(team)); AddScore(other, ent->r.currentOrigin, CTF_RECOVERY_BONUS); other->client->pers.teamState.lastreturnedflag = level.time; // 'ResetFlag' will remove this entity! We must return zero Team_ReturnFlagSound(Team_ResetFlag(team), team); return 0; } } // the flag is at home base. if the player has the enemy flag, he's just won! if (!cl->ps.powerups[enemy_flag]) { return 0; // we don't have the flag } if (g_gametype.integer == GT_1FCTF) { trap_SendServerCommand(-1, va("cp \"%s" S_COLOR_WHITE "\ncaptured the flag!\n\"", cl->pers.netname)); } else { trap_SendServerCommand(-1, va("cp \"%s" S_COLOR_WHITE "\ncaptured the %s flag!\n\"", cl->pers.netname, TeamName(OtherTeam(team)))); } cl->ps.powerups[enemy_flag] = 0; other->client->rewardTime = level.time + REWARD_TIME; other->client->ps.persistant[PERS_CAPTURES]++; // other gets another 10 frag bonus AddScore(other, ent->r.currentOrigin, CTF_CAPTURE_BONUS); // ok, let's do the player loop, hand out the bonuses for (i = 0; i < g_maxclients.integer; i++) { player = &g_entities[i]; // also make sure we don't award assist bonuses to the flag carrier himself. if (!player->inuse || player == other) { continue; } if (player->client->sess.sessionTeam != cl->sess.sessionTeam) { player->client->pers.teamState.lasthurtcarrier = -5; } else if (player->client->sess.sessionTeam == cl->sess.sessionTeam) { AddScore(player, ent->r.currentOrigin, CTF_TEAM_BONUS); // award extra points for capture assists if (player->client->pers.teamState.lastreturnedflag + CTF_RETURN_FLAG_ASSIST_TIMEOUT > level.time) { AddScore(player, ent->r.currentOrigin, CTF_RETURN_FLAG_ASSIST_BONUS); player->client->ps.persistant[PERS_ASSIST_COUNT]++; player->client->rewardTime = level.time + REWARD_TIME; } if (player->client->pers.teamState.lastfraggedcarrier + CTF_FRAG_CARRIER_ASSIST_TIMEOUT > level.time) { AddScore(player, ent->r.currentOrigin, CTF_FRAG_CARRIER_ASSIST_BONUS); player->client->ps.persistant[PERS_ASSIST_COUNT]++; player->client->rewardTime = level.time + REWARD_TIME; } } } teamgame.last_flag_capture = level.time; teamgame.last_capture_team = team; // increase the team's score AddTeamScore(ent->s.pos.trBase, other->client->sess.sessionTeam, 1); CalculateRanks(); Team_ResetFlags(); Team_CaptureFlagSound(ent, team); Team_ForceGesture(other->client->sess.sessionTeam); return 0; // do not respawn this automatically }
void ThinkBalloonzone( gentity_t *self ) { //"(team == 0) ? TEAM_RED : TEAM_BLUE" => ! in this code red=0, blue=1 ! (unlike TEAM_RED(1), TEAM_BLUE(2) from team_t) // FIXME: Remove that offset team uglyness or at least make it readable!!1! int team, opponent; int numPlayers; team_t tteam; char *msg; if ( !self->message ) { msg = "Balloon"; } else { msg = self->message; } if ( self->target_ent->s.frame ) { // get teams team = ( self->target_ent->s.generic1 - 1 ); opponent = ( team ^ 1 ); tteam = ( team + 1 ); // capturing if ( ( self->target_ent->s.frame < 11 ) && ( self->teamMask & ( 1 << team ) ) && !( self->teamMask & (1 << opponent ) ) ) { numPlayers = NumPlayersAtBalloon( self, tteam ); if ( numPlayers <= 0 ) { numPlayers = 1; //... so, we must not check this later } self->teamTime[team] += ( BALLOON_THINKTIME * numPlayers ); self->target_ent->s.frame = ( 1 + self->teamTime[team] / ( 100 * self->speed ) ); if ( self->target_ent->s.frame >= 11 ) { // captured self->last_move_time = 0; self->teamTime[team] = 0; level.balloonState[self->count] = ( '1' + team ); trap_SetConfigstring( CS_BALLOONS, level.balloonState ); // TODO: Give more points for capturing than for owning? // Need to test balance! AddTeamScore( self->s.pos.trBase, tteam, ( BalloonScore() * 2 ), SCORE_BONUS_CAPTURE_S ); AddBalloonScores( self, tteam, 1 ); trap_SendServerCommand( -1, va( "mp \"%s captured by %s Team\"", msg, TeamName( tteam ) ) ); } } // balloon is fully raised if ( self->target_ent->s.frame >= 11 ) { // animate self->last_move_time += BALLOON_THINKTIME; if ( self->last_move_time >= ( 700 * self->speed ) ) { self->last_move_time -= ( 700 * self->speed ); } self->target_ent->s.frame = ( 11 + self->last_move_time / ( 100 * self->speed ) ); // give points if ( !level.intermissiontime ) { self->teamTime[team] += BALLOON_THINKTIME; while ( self->teamTime[team] >= BALLOON_POINTTIME ) { self->teamTime[team] -= BALLOON_POINTTIME; AddTeamScore( self->s.pos.trBase, tteam, ( BalloonScore() * 2 ), SCORE_BONUS_CAPTURE_TEAM_S ); } } } // countering capture if ( self->teamMask & (1 << opponent ) ) { numPlayers = NumPlayersAtBalloon( self, tteam ); if ( numPlayers <= 0 ) { numPlayers = 1; //... so, we must not check this later } if ( !self->teamTime[opponent] ) { self->teamTime[opponent] = level.time; } // FIXME: If some players come "later", they will also be calculated for the full time. else if ( level.time > ( self->teamTime[opponent] + ( self->wait * 1000 / numPlayers ) ) ) { // countered self->teamTime[0] = 0; self->teamTime[1] = 0; self->target_ent->s.frame = 0; level.balloonState[self->count] = '0'; trap_SetConfigstring( CS_BALLOONS, level.balloonState ); // TODO: Also give players//&team points for destroying a balloon? trap_SendServerCommand( -1, va( "mp \"%s destroyed by %s Team\"", msg, TeamName( OtherTeam( tteam ) ) ) ); } } else { self->teamTime[opponent] = 0; } } else { if ( ( self->teamMask & BT_RED ) && ( self->teamMask & BT_BLUE ) ) { // reset timer if both teams are trying to capture self->teamTime[0] = 0; self->teamTime[1] = 0; } else { for ( team = 0; team < 2; team++ ) { if ( self->teamMask & ( 1 << team ) ) { // start capture timer or test for capture if ( !self->teamTime[team] ) { self->teamTime[team] = level.time; } else if ( level.time > ( self->teamTime[team] + 1000 ) ) { self->teamTime[team] = 0; self->teamTime[team^1] = level.time; self->target_ent->s.generic1 = ( team + 1 ); self->target_ent->s.frame = 1; level.balloonState[self->count] = ( 'a' + team ); trap_SetConfigstring( CS_BALLOONS, level.balloonState ); trap_SendServerCommand( -1, va( "mp \"%s under attack by %s Team\"", msg, TeamName( team + 1 ) ) ); } } else { self->teamTime[team] = 0; } } } } // prepare next think //#@070329: some delay ... i think there isn't always a touch-call (with laging clients) // "TEAM_RED ? 0 : 1" @ teamTime[...] if ( ( self->target_ent->teamTime[0] + BALLOON_TOUCHDELAY ) < level.time ) { self->teamMask &= ~BT_RED; } if ( ( self->target_ent->teamTime[1] + BALLOON_TOUCHDELAY ) < level.time ) { self->teamMask &= ~BT_BLUE; } self->nextthink = ( level.time + BALLOON_THINKTIME ); }
/* ============== Team_DroppedFlagThink ============== */ int Team_TouchOurFlag( gentity_t *ent, gentity_t *other, int team ) { int i; gentity_t *player; gclient_t *cl = other->client; int enemy_flag; #ifdef MISSIONPACK if( g_gametype.integer == GT_1FCTF ) { enemy_flag = PW_NEUTRALFLAG; } else { #endif if (cl->sess.sessionTeam == TEAM_RED) { enemy_flag = PW_BLUEFLAG; } else { enemy_flag = PW_REDFLAG; } if ( ent->flags & FL_DROPPED_ITEM ) { // hey, its not home. return it by teleporting it back PrintMsg( NULL, "%s" S_COLOR_WHITE " returned the %s flag!\n", cl->pers.netname, TeamName(team)); AddScore(other, ent->r.currentOrigin, CTF_RECOVERY_BONUS); other->client->pers.teamState.flagrecovery++; other->client->pers.teamState.lastreturnedflag = level.time; //ResetFlag will remove this entity! We must return zero Team_ReturnFlagSound(Team_ResetFlag(team), team); return 0; } #ifdef MISSIONPACK } #endif // the flag is at home base. if the player has the enemy // flag, he's just won! if (!cl->ps.powerups[enemy_flag]) return 0; // We don't have the flag #ifdef MISSIONPACK if( g_gametype.integer == GT_1FCTF ) { PrintMsg( NULL, "%s" S_COLOR_WHITE " captured the flag!\n", cl->pers.netname ); } else { #endif PrintMsg( NULL, "%s" S_COLOR_WHITE " captured the %s flag!\n", cl->pers.netname, TeamName(OtherTeam(team))); #ifdef MISSIONPACK } #endif cl->ps.powerups[enemy_flag] = 0; teamgame.last_flag_capture = level.time; teamgame.last_capture_team = team; // Increase the team's score AddTeamScore(ent->s.pos.trBase, other->client->sess.sessionTeam, 1); Team_ForceGesture(other->client->sess.sessionTeam); other->client->pers.teamState.captures++; // add the sprite over the player's head other->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP ); other->client->ps.eFlags |= EF_AWARD_CAP; other->client->rewardTime = level.time + REWARD_SPRITE_TIME; other->client->ps.persistant[PERS_CAPTURES]++; // other gets another 10 frag bonus AddScore(other, ent->r.currentOrigin, CTF_CAPTURE_BONUS); Team_CaptureFlagSound( ent, team ); // Ok, let's do the player loop, hand out the bonuses for (i = 0; i < g_maxclients.integer; i++) { player = &g_entities[i]; if (!player->inuse) continue; if (player->client->sess.sessionTeam != cl->sess.sessionTeam) { player->client->pers.teamState.lasthurtcarrier = -5; } else if (player->client->sess.sessionTeam == cl->sess.sessionTeam) { if (player != other) AddScore(player, ent->r.currentOrigin, CTF_TEAM_BONUS); // award extra points for capture assists if (player->client->pers.teamState.lastreturnedflag + CTF_RETURN_FLAG_ASSIST_TIMEOUT > level.time) { AddScore (player, ent->r.currentOrigin, CTF_RETURN_FLAG_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; // add the sprite over the player's head player->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP ); player->client->ps.eFlags |= EF_AWARD_ASSIST; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } else if (player->client->pers.teamState.lastfraggedcarrier + CTF_FRAG_CARRIER_ASSIST_TIMEOUT > level.time) { AddScore(player, ent->r.currentOrigin, CTF_FRAG_CARRIER_ASSIST_BONUS); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; // add the sprite over the player's head player->client->ps.eFlags &= ~(EF_AWARD_IMPRESSIVE | EF_AWARD_EXCELLENT | EF_AWARD_GAUNTLET | EF_AWARD_ASSIST | EF_AWARD_DEFEND | EF_AWARD_CAP ); player->client->ps.eFlags |= EF_AWARD_ASSIST; player->client->rewardTime = level.time + REWARD_SPRITE_TIME; } } } Team_ResetFlags(); CalculateRanks(); return 0; // Do not respawn this automatically }
/* ============== Team_DroppedFlagThink ============== */ int Team_TouchOurFlag( gentity_t *ent, gentity_t *other, int team ) { int i; gentity_t *player; gclient_t *cl = other->client; int enemy_flag; if (cl->sess.sessionTeam == TEAM_RED) { enemy_flag = PW_BLUEFLAG; } else { enemy_flag = PW_REDFLAG; } if ( ent->flags & FL_DROPPED_ITEM ) { // hey, it's not home. return it by teleporting it back PrintMsg( NULL, "%s" S_COLOR_WHITE " returned the %s lolly!\n", cl->pers.netname, TeamName( team ) ); AddScore( other, ent->r.currentOrigin, CTF_RECOVERY_BONUS, SCORE_BONUS_RECOVERY_S ); other->client->pers.teamState.flagrecovery++; other->client->pers.teamState.lastreturnedflag = level.time; //ResetFlag will remove this entity! We must return zero Team_ReturnFlagSound(Team_ResetFlag(team), team); return 0; } // the flag is at home base. if the player has the enemy // flag, he's just won! if (!cl->ps.powerups[enemy_flag]) return 0; // We don't have the flag PrintMsg( NULL, "%s" S_COLOR_WHITE " captured the %s lolly!\n", cl->pers.netname, TeamName(OtherTeam(team))); cl->ps.powerups[enemy_flag] = 0; teamgame.last_flag_capture = level.time; teamgame.last_capture_team = team; // Increase the team's score AddTeamScore( ent->s.pos.trBase, other->client->sess.sessionTeam, SCORE_CAPTURE, SCORE_BONUS_CAPTURE_S ); // Team_ForceGesture(other->client->sess.sessionTeam); other->client->pers.teamState.captures++; // add the sprite over the player's head SetAward( other->client, AWARD_CAP ); other->client->ps.persistant[PERS_CAPTURES]++; // other gets another 10 frag bonus AddScore( other, ent->r.currentOrigin, CTF_CAPTURE_BONUS, SCORE_BONUS_CAPTURE_S ); Team_CaptureFlagSound( ent, team ); // Ok, let's do the player loop, hand out the bonuses for (i = 0; i < g_maxclients.integer; i++) { player = &g_entities[i]; // also make sure we don't award assist bonuses to the flag carrier himself. if (!player->inuse || player == other) continue; if (player->client->sess.sessionTeam != cl->sess.sessionTeam) { player->client->pers.teamState.lasthurtcarrier = -5; } else if (player->client->sess.sessionTeam == cl->sess.sessionTeam) { if (player != other) AddScore( player, ent->r.currentOrigin, CTF_TEAM_BONUS, SCORE_BONUS_CAPTURE_TEAM_S ); // award extra points for capture assists if (player->client->pers.teamState.lastreturnedflag + CTF_RETURN_FLAG_ASSIST_TIMEOUT > level.time) { AddScore( player, ent->r.currentOrigin, CTF_RETURN_FLAG_ASSIST_BONUS, SCORE_BONUS_ASSIST_RETURN_S ); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; // add the sprite over the player's head SetAward( player->client, AWARD_ASSIST ); } else if (player->client->pers.teamState.lastfraggedcarrier + CTF_FRAG_CARRIER_ASSIST_TIMEOUT > level.time) { AddScore( player, ent->r.currentOrigin, CTF_FRAG_CARRIER_ASSIST_BONUS, SCORE_BONUS_ASSIST_FRAG_CARRIER_S ); other->client->pers.teamState.assists++; player->client->ps.persistant[PERS_ASSIST_COUNT]++; // add the sprite over the player's head SetAward( player->client, AWARD_ASSIST ); } } } Team_ResetFlags(); return 0; // Do not respawn this automatically }