int Pickup_Team(Gentity *ent, Gentity *other) { int team; Gclient *cl = other->client; /* figure out what team this flag is */ if(strcmp(ent->classname, "team_CTF_redflag") == 0) team = TEAM_RED; else if(strcmp(ent->classname, "team_CTF_blueflag") == 0) team = TEAM_BLUE; else if(strcmp(ent->classname, "team_CTF_neutralflag") == 0) team = TEAM_FREE; else{ PrintMsg (other, "Don't know what team the flag is on.\n"); return 0; } if(g_gametype.integer == GT_1FCTF){ if(team == TEAM_FREE) return Team_TouchEnemyFlag(ent, other, cl->sess.team); if(team != cl->sess.team) return Team_TouchOurFlag(ent, other, cl->sess.team); return 0; } /* GT_CTF */ if(team == cl->sess.team) return Team_TouchOurFlag(ent, other, team); return Team_TouchEnemyFlag(ent, other, team); }
int Pickup_Team( gentity_t *ent, gentity_t *other ) { int team; gclient_t *cl = other->client; // figure out what team this flag is if( strcmp(ent->classname, "team_CTF_redflag") == 0 ) { team = TEAM_RED; } else if( strcmp(ent->classname, "team_CTF_blueflag") == 0 ) { team = TEAM_BLUE; } else if( strcmp(ent->classname, "team_CTF_neutralflag") == 0 ) { team = TEAM_FREE; } else { PrintMsg ( other, "Don't know what team the flag is on.\n"); return 0; } if( g_gametype.integer == GT_1FCTF ) { if( team == TEAM_FREE ) { return Team_TouchEnemyFlag( ent, other, cl->sess.sessionTeam ); } if( team != cl->sess.sessionTeam) { return Team_TouchOurFlag( ent, other, cl->sess.sessionTeam ); } return 0; } // GT_CTF if( team == cl->sess.sessionTeam) { return Team_TouchOurFlag( ent, other, team ); } return Team_TouchEnemyFlag( ent, other, team ); }
int Pickup_Team( gentity_t *ent, gentity_t *other ) { int team; gclient_t *cl = other->client; #ifdef MISSIONPACK if( g_gametype.integer == GT_OBELISK ) { // there are no team items that can be picked up in obelisk G_FreeEntity( ent ); return 0; } if( g_gametype.integer == GT_HARVESTER ) { // the only team items that can be picked up in harvester are the cubes if( ent->spawnflags != cl->sess.sessionTeam ) { cl->ps.generic1 += 1; } G_FreeEntity( ent ); return 0; } #endif // figure out what team this flag is if( strcmp(ent->classname, "team_CTF_redflag") == 0 ) { team = TEAM_RED; } else if( strcmp(ent->classname, "team_CTF_blueflag") == 0 ) { team = TEAM_BLUE; } #ifdef MISSIONPACK else if( strcmp(ent->classname, "team_CTF_neutralflag") == 0 ) { team = TEAM_FREE; } #endif else { PrintMsg ( other, "Don't know what team the flag is on.\n"); return 0; } #ifdef MISSIONPACK if( g_gametype.integer == GT_1FCTF ) { if( team == TEAM_FREE ) { return Team_TouchEnemyFlag( ent, other, cl->sess.sessionTeam ); } if( team != cl->sess.sessionTeam) { return Team_TouchOurFlag( ent, other, cl->sess.sessionTeam ); } return 0; } #endif // GT_CTF if( team == cl->sess.sessionTeam) { return Team_TouchOurFlag( ent, other, team ); } return Team_TouchEnemyFlag( ent, other, team ); }
int Pickup_Team( gentity_t *ent, gentity_t *other ) { int team; gclient_t *cl = other->client; // figure out what team this flag is if( strcmp(ent->classname, "team_CTL_redlolly") == 0 ) { team = TEAM_RED; } else if( strcmp(ent->classname, "team_CTL_bluelolly") == 0 ) { team = TEAM_BLUE; } else { PrintMsg ( other, "Don't know what team the lolly is on.\n"); return 0; } // GT_CTF if( team == cl->sess.sessionTeam) { return Team_TouchOurFlag( ent, other, team ); } return Team_TouchEnemyFlag( ent, other, team ); }
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 }