/* ================== BotChat_Kill ================== */ int BotChat_Kill(bot_state_t *bs) { char name[32]; float rnd; if (bot_nochat.integer) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_KILL, 0, 1); // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; //if fast chat is off if (!bot_fastchat.integer) { if (random() > rnd) return qfalse; } if (bs->lastkilledplayer == bs->client) return qfalse; if (BotNumActivePlayers() <= 1) return qfalse; if (!BotValidChatPosition(bs)) return qfalse; // if (BotVisibleEnemies(bs)) return qfalse; // EasyClientName(bs->lastkilledplayer, name, 32); // bs->chatto = CHAT_ALL; if (TeamPlayIsOn() && BotSameTeam(bs, bs->lastkilledplayer)) { BotAI_BotInitialChat(bs, "kill_teammate", name, NULL); bs->chatto = CHAT_TEAM; } else { //don't chat in teamplay if (TeamPlayIsOn()) { #ifdef MISSIONPACK trap_EA_Command(bs->client, "vtaunt"); #endif return qfalse; // don't wait } // if (bs->enemydeathtype == MOD_GAUNTLET) { BotAI_BotInitialChat(bs, "kill_gauntlet", name, NULL); } else if (bs->enemydeathtype == MOD_RAILGUN) { BotAI_BotInitialChat(bs, "kill_rail", name, NULL); } else if (bs->enemydeathtype == MOD_TELEFRAG) { BotAI_BotInitialChat(bs, "kill_telefrag", name, NULL); } #ifdef MISSIONPACK else if (bs->botdeathtype == MOD_KAMIKAZE && trap_BotNumInitialChats(bs->cs, "kill_kamikaze")) BotAI_BotInitialChat(bs, "kill_kamikaze", name, NULL); #endif //choose between insult and praise else if (random() < trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_INSULT, 0, 1)) { BotAI_BotInitialChat(bs, "kill_insult", name, NULL); } else { BotAI_BotInitialChat(bs, "kill_praise", name, NULL); } } bs->lastchat_time = FloatTime(); return qtrue; }
/* ================== BotChat_Kill ================== */ int BotChat_Kill( bot_state_t *bs ) { char name[32]; float rnd; if ( bot_nochat.integer ) { return qfalse; } if ( bs->lastchat_time > trap_AAS_Time() - 3 ) { return qfalse; } rnd = trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_KILL, 0, 1 ); //if fast chat is off if ( !bot_fastchat.integer ) { if ( random() > rnd ) { return qfalse; } } if ( bs->lastkilledplayer == bs->client ) { return qfalse; } if ( BotNumActivePlayers() <= 1 ) { return qfalse; } if ( !BotValidChatPosition( bs ) ) { return qfalse; } // EasyClientName( bs->lastkilledplayer, name, 32 ); // bs->chatto = CHAT_ALL; if ( TeamPlayIsOn() && BotSameTeam( bs, bs->lastkilledplayer ) ) { BotAI_BotInitialChat( bs, "kill_teammate", name, NULL ); bs->chatto = CHAT_TEAM; } else { //don't chat in teamplay if ( TeamPlayIsOn() ) { return qfalse; } // if ( bs->enemydeathtype == MOD_GAUNTLET ) { BotAI_BotInitialChat( bs, "kill_gauntlet", name, NULL ); } else if ( bs->enemydeathtype == MOD_RAILGUN ) { BotAI_BotInitialChat( bs, "kill_rail", name, NULL ); } else if ( bs->enemydeathtype == MOD_TELEFRAG ) { BotAI_BotInitialChat( bs, "kill_telefrag", name, NULL ); } //choose between insult and praise else if ( random() < trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_INSULT, 0, 1 ) ) { BotAI_BotInitialChat( bs, "kill_insult", name, NULL ); } else { BotAI_BotInitialChat( bs, "kill_praise", name, NULL ); } } bs->lastchat_time = trap_AAS_Time(); return qtrue; }
int BotVoiceChatCommand(bot_state_t *bs, int mode, char *voiceChat) { int i, clientNum; char *ptr, buf[MAX_MESSAGE_SIZE], *cmd,*cmd2; if (!TeamPlayIsOn()) { return qfalse; } if ( mode == SAY_ALL ) { return qfalse; } Q_strncpyz(buf, voiceChat, sizeof(buf)); cmd = buf; ptr = strchr(buf,' '); *ptr++ = 0; clientNum = atoi(ptr); cmd2 = ptr+2; ptr = strchr(cmd2,' '); *ptr = 0; if (!BotSameTeam(bs, clientNum)) { return qfalse; } for (i = 0; voiceCommands[i].cmd; i++) { if (!Q_stricmp(cmd2, voiceCommands[i].cmd)) { voiceCommands[i].func(bs, clientNum, mode); return qtrue; } } return qfalse; }
/* ================== BotChat_HitTalking ================== */ int BotChat_HitTalking(bot_state_t *bs) { char name[32], *weap; int lasthurt_client; float rnd; if (bot_nochat.integer) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; if (BotNumActivePlayers() <= 1) return qfalse; lasthurt_client = g_entities[bs->client].client->lasthurt_client; if (!lasthurt_client) return qfalse; if (lasthurt_client == bs->client) return qfalse; // if (lasthurt_client < 0 || lasthurt_client >= MAX_CLIENTS) return qfalse; // rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_HITTALKING, 0, 1); //don't chat in teamplay if (TeamPlayIsOn()) return qfalse; // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; //if fast chat is off if (!bot_fastchat.integer) { if (random() > rnd * 0.5) return qfalse; } if (!BotValidChatPosition(bs)) return qfalse; // ClientName(g_entities[bs->client].client->lasthurt_client, name, sizeof(name)); weap = BotWeaponNameForMeansOfDeath(g_entities[bs->client].client->lasthurt_mod); // BotAI_BotInitialChat(bs, "hit_talking", name, weap, NULL); bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotChat_HitNoDeath ================== */ int BotChat_HitNoDeath( bot_state_t *bs ) { char name[32]; const char* weap; float rnd; int lasthurt_client; aas_entityinfo_t entinfo; lasthurt_client = g_entities[bs->client].client->lasthurt_client; if ( !lasthurt_client ) { return qfalse; } if ( lasthurt_client == bs->client ) { return qfalse; } // if ( lasthurt_client < 0 || lasthurt_client >= MAX_CLIENTS ) { return qfalse; } // if ( bot_nochat.integer ) { return qfalse; } if ( bs->lastchat_time > trap_AAS_Time() - 3 ) { return qfalse; } if ( BotNumActivePlayers() <= 1 ) { return qfalse; } rnd = trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_HITNODEATH, 0, 1 ); //don't chat in teamplay if ( TeamPlayIsOn() ) { return qfalse; } //if fast chat is off if ( !bot_fastchat.integer ) { if ( random() > rnd * 0.5 ) { return qfalse; } } if ( !BotValidChatPosition( bs ) ) { return qfalse; } //if the enemy is visible if ( BotEntityVisible( bs->client, bs->eye, bs->viewangles, 360, bs->enemy ) ) { return qfalse; } // BotEntityInfo( bs->enemy, &entinfo ); if ( EntityIsShooting( &entinfo ) ) { return qfalse; } // ClientName( lasthurt_client, name, sizeof( name ) ); weap = BotWeaponNameForMeansOfDeath( g_entities[bs->client].client->lasthurt_mod ); // BotAI_BotInitialChat( bs, "hit_nodeath", name, weap, NULL ); bs->lastchat_time = trap_AAS_Time(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotChat_EnterGame ================== */ int BotChat_EnterGame(bot_state_t *bs) { char name[32]; float rnd; if (bot_nochat.integer) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; //don't chat in teamplay if (TeamPlayIsOn()) return qfalse; // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_ENTEREXITGAME, 0, 1); if (!bot_fastchat.integer) { if (random() > rnd) return qfalse; } if (BotNumActivePlayers() <= 1) return qfalse; if (!BotValidChatPosition(bs)) return qfalse; BotAI_BotInitialChat(bs, "game_enter", EasyClientName(bs->client, name, 32), // 0 BotRandomOpponentName(bs), // 1 "[invalid var]", // 2 "[invalid var]", // 3 BotMapTitle(), // 4 NULL); bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotMatch_WhereAreYou ================== */ void BotMatch_WhereAreYou( bot_state_t *bs, bot_match_t *match ) { float dist, bestdist; int i, bestitem, redflagtt, blueflagtt, redtobluett; bot_goal_t goal; char *nearbyitems[] = { "Shotgun", "Grenade Launcher", "Rocket Launcher", "Plasmagun", "Railgun", "Lightning Gun", "BFG10K", "Quad Damage", "Regeneration", "Battle Suit", "Speed", "Invisibility", "Flight", "Armor", "Heavy Armor", "Red Flag", "Blue Flag", NULL }; // if ( !TeamPlayIsOn() ) { return; } //if not addressed to this bot if ( !BotAddressedToBot( bs, match ) ) { return; } bestitem = -1; bestdist = 999999; for ( i = 0; nearbyitems[i]; i++ ) { dist = BotNearestVisibleItem( bs, nearbyitems[i], &goal ); if ( dist < bestdist ) { bestdist = dist; bestitem = i; } } if ( bestitem != -1 ) { if ( gametype == GT_CTF ) { redflagtt = trap_AAS_AreaTravelTimeToGoalArea( bs->areanum, bs->origin, ctf_redflag.areanum, TFL_DEFAULT ); blueflagtt = trap_AAS_AreaTravelTimeToGoalArea( bs->areanum, bs->origin, ctf_blueflag.areanum, TFL_DEFAULT ); redtobluett = trap_AAS_AreaTravelTimeToGoalArea( ctf_redflag.areanum, ctf_redflag.origin, ctf_blueflag.areanum, TFL_DEFAULT ); if ( redflagtt < ( redflagtt + blueflagtt ) * 0.4 ) { BotAI_BotInitialChat( bs, "ctflocation", nearbyitems[bestitem], "red", NULL ); } else if ( blueflagtt < ( redflagtt + blueflagtt ) * 0.4 ) { BotAI_BotInitialChat( bs, "ctflocation", nearbyitems[bestitem], "blue", NULL ); } else { BotAI_BotInitialChat( bs, "location", nearbyitems[bestitem], NULL ); } } else { BotAI_BotInitialChat( bs, "location", nearbyitems[bestitem], NULL ); } trap_BotEnterChat( bs->cs, bs->client, CHAT_TEAM ); } }
/* ======================================================================================================================================= BotChat_ExitGame ======================================================================================================================================= */ int BotChat_ExitGame(bot_state_t *bs) { char name[32]; float rnd; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) { return qfalse; } // don't chat in teamplay if (TeamPlayIsOn()) { return qfalse; } // don't chat in tournament mode if (gametype == GT_TOURNAMENT) { return qfalse; } rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_ENTEREXITGAME, 0, 1); if (random() > rnd) { return qfalse; } if (BotNumActivePlayers() <= 1) { return qfalse; } BotAI_BotInitialChat(bs, "game_exit", EasyClientName(bs->client, name, 32), BotRandomOpponentName(bs), "[invalid var]", "[invalid var]", BotMapTitle(), NULL); bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotMatch_Patrol ================== */ void BotMatch_Patrol(bot_state_t *bs, bot_match_t *match) { char netname[MAX_MESSAGE_SIZE]; int client; if (!TeamPlayIsOn()) return; //if not addressed to this bot if (!BotAddressedToBot(bs, match)) return; //get the patrol waypoints if (!BotGetPatrolWaypoints(bs, match)) return; // trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); // client = FindClientByName(netname); // bs->decisionmaker = client; bs->ordered = qtrue; bs->order_time = FloatTime(); //set the time to send a message to the team mates bs->teammessage_time = FloatTime() + 2 * random(); //set the ltg type bs->ltgtype = LTG_PATROL; //get the team goal time bs->teamgoal_time = BotGetTime(match); //set the team goal time if not set already if (!bs->teamgoal_time) bs->teamgoal_time = FloatTime() + TEAM_PATROL_TIME; // BotSetTeamStatus(bs); // remember last ordered task BotRememberLastOrderedTask(bs); #ifdef DEBUG BotPrintTeamGoal(bs); #endif //DEBUG }
/* ================== BotChat_StartLevel ================== */ int BotChat_StartLevel(bot_state_t *bs) { char name[32]; float rnd; if (bot_nochat.integer) return qfalse; if (BotIsObserver(bs)) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; //don't chat in teamplay if (TeamPlayIsOn()) { #ifdef MISSIONPACK trap_EA_Command(bs->client, "vtaunt"); #endif return qfalse; } // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_STARTENDLEVEL, 0, 1); if (!bot_fastchat.integer) { if (random() > rnd) return qfalse; } if (BotNumActivePlayers() <= 1) return qfalse; BotAI_BotInitialChat(bs, "level_start", EasyClientName(bs->client, name, 32), // 0 NULL); bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ======================================================================================================================================= BotMatch_FormationSpace ======================================================================================================================================= */ void BotMatch_FormationSpace(bot_state_t *bs, bot_match_t *match) { char buf[MAX_MESSAGE_SIZE]; float space; if (!TeamPlayIsOn()) { return; } // if not addressed to this bot if (!BotAddressedToBot(bs, match)) { return; } trap_BotMatchVariable(match, NUMBER, buf, MAX_MESSAGE_SIZE); // if it's the distance in feet if (match->subtype & ST_FEET) { space = 0.3048 * 32 * atof(buf); } // else it's in meters else {space = 32 * atof(buf);} // check if the formation intervening space is valid if (space < 48 || space > 500) { space = 100; } bs->formation_dist = space; }
void BotMatch_CatchMe(bot_state_t *bs, bot_match_t *match){ char netname[MAX_MESSAGE_SIZE]; int client; //if not addressed to this bot if ( !TeamPlayIsOn() || !BotAddressedToBot(bs, match) ) return; // who wants me to to come? trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); client = ClientOnSameTeamFromName(bs, netname); bs->teammate = client; bs->teammatevisible_time = FloatTime(); //last time the team mate was assumed visible bs->decisionmaker = client; // bs->ordered = qtrue; //bs->order_time = FloatTime(); //set the time to send a message to the team mates bs->teammessage_time = FloatTime() + 2 * random(); //set the ltg type bs->ltgtype = LTG_JOINMATE; //set the team goal time bs->teamgoal_time = FloatTime() + 300; // 5 minutes }
/* ======================================================================================================================================= BotMatch_Patrol ======================================================================================================================================= */ void BotMatch_Patrol(bot_state_t *bs, bot_match_t *match) { if (!TeamPlayIsOn()) { return; } // if not addressed to this bot if (!BotAddressedToBot(bs, match)) { return; } // get the patrol waypoints if (!BotGetPatrolWaypoints(bs, match)) { return; } // set the time to send a message to the team mates bs->teammessage_time = trap_AAS_Time() + 2 * random(); // set the ltg type bs->ltgtype = LTG_PATROL; // get the team goal time bs->teamgoal_time = BotGetTime(match); // set the team goal time if not set already if (!bs->teamgoal_time) { bs->teamgoal_time = trap_AAS_Time() + TEAM_PATROL_TIME; } #ifdef DEBUG BotPrintTeamGoal(bs); #endif // DEBUG }
/* ================== BotChat_ExitGame ================== */ int BotChat_ExitGame( bot_state_t *bs ) { char name[32]; float rnd; if ( bot_nochat.integer ) { return qfalse; } if ( bs->lastchat_time > trap_AAS_Time() - 3 ) { return qfalse; } //don't chat in teamplay if ( TeamPlayIsOn() ) { return qfalse; } rnd = trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_ENTEREXITGAME, 0, 1 ); if ( !bot_fastchat.integer ) { if ( random() > rnd ) { return qfalse; } } if ( BotNumActivePlayers() <= 1 ) { return qfalse; } // BotAI_BotInitialChat( bs, "game_exit", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 "[invalid var]", // 2 "[invalid var]", // 3 BotMapTitle(), // 4 NULL ); bs->lastchat_time = trap_AAS_Time(); bs->chatto = CHAT_ALL; return qtrue; }
/* ======================================================================================================================================= BotMatch_GetItem ======================================================================================================================================= */ void BotMatch_GetItem(bot_state_t *bs, bot_match_t *match) { char itemname[MAX_MESSAGE_SIZE]; if (!TeamPlayIsOn()) { return; } // if not addressed to this bot if (!BotAddressedToBot(bs, match)) { return; } // get the match variable trap_BotMatchVariable(match, ITEM, itemname, sizeof(itemname)); if (!BotGetMessageTeamGoal(bs, itemname, &bs->teamgoal)) { // BotAI_BotInitialChat(bs, "cannotfind", itemname, NULL); // trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); return; } // set the time to send a message to the team mates bs->teammessage_time = trap_AAS_Time() + 2 * random(); // set the ltg type bs->ltgtype = LTG_GETITEM; // set the team goal time bs->teamgoal_time = trap_AAS_Time() + TEAM_GETITEM_TIME; #ifdef DEBUG BotPrintTeamGoal(bs); #endif // DEBUG }
/* ======================================================================================================================================= BotMatch_StartTeamLeaderShip ======================================================================================================================================= */ void BotMatch_StartTeamLeaderShip(bot_state_t *bs, bot_match_t *match) { int client; char teammate[MAX_MESSAGE_SIZE]; if (!TeamPlayIsOn()) { return; } // if chats for him or herself if (match->subtype & ST_I) { // get the team mate that will be the team leader trap_BotMatchVariable(match, NETNAME, teammate, sizeof(teammate)); strncpy(bs->teamleader, teammate, sizeof(bs->teamleader)); bs->teamleader[sizeof(bs->teamleader) - 1] = '\0'; } // chats for someone else else { // get the team mate that will be the team leader trap_BotMatchVariable(match, TEAMMATE, teammate, sizeof(teammate)); client = FindClientByName(teammate); if (client >= 0) { ClientName(client, bs->teamleader, sizeof(bs->teamleader)); } } }
/* ======================================================================================================================================= BotMatch_StopTeamLeaderShip ======================================================================================================================================= */ void BotMatch_StopTeamLeaderShip(bot_state_t *bs, bot_match_t *match) { int client; char teammate[MAX_MESSAGE_SIZE]; char netname[MAX_MESSAGE_SIZE]; if (!TeamPlayIsOn()) { return; } // get the team mate that stops being the team leader trap_BotMatchVariable(match, TEAMMATE, teammate, sizeof(teammate)); // if chats for him or herself if (match->subtype & ST_I) { trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); client = FindClientByName(netname); } // chats for someone else else { client = FindClientByName(teammate); } if (client >= 0) { if (!Q_stricmp(bs->teamleader, ClientName(client, netname, sizeof(netname)))) { bs->teamleader[0] = '\0'; } } }
/* ================== BotMatch_GetItem ================== */ void BotMatch_GetItem(bot_state_t *bs, bot_match_t *match) { char itemname[MAX_MESSAGE_SIZE]; char netname[MAX_MESSAGE_SIZE]; int client; if (!TeamPlayIsOn()) return; //if not addressed to this bot if (!BotAddressedToBot(bs, match)) return; //get the match variable trap_BotMatchVariable(match, ITEM, itemname, sizeof(itemname)); // if (!BotGetMessageTeamGoal(bs, itemname, &bs->teamgoal)) { //BotAI_BotInitialChat(bs, "cannotfind", itemname, NULL); //trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); return; } trap_BotMatchVariable(match, NETNAME, netname, sizeof(netname)); client = ClientOnSameTeamFromName(bs, netname); // bs->decisionmaker = client; bs->ordered = qtrue; bs->order_time = FloatTime(); //set the time to send a message to the team mates bs->teammessage_time = FloatTime() + 2 * random(); //set the ltg type bs->ltgtype = LTG_GETITEM; //set the team goal time bs->teamgoal_time = FloatTime() + TEAM_GETITEM_TIME; // BotSetTeamStatus(bs); #ifdef DEBUG BotPrintTeamGoal(bs); #endif //DEBUG }
/* ================== BotChat_StartLevel ================== */ int BotChat_StartLevel( bot_state_t *bs ) { char name[32]; float rnd; if ( bot_nochat.integer ) { return qfalse; } if ( BotIsObserver( bs ) ) { return qfalse; } if ( bs->lastchat_time > trap_AAS_Time() - 3 ) { return qfalse; } //don't chat in teamplay if ( TeamPlayIsOn() ) { return qfalse; } rnd = trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_STARTENDLEVEL, 0, 1 ); if ( !bot_fastchat.integer ) { if ( random() > rnd ) { return qfalse; } } if ( BotNumActivePlayers() <= 1 ) { return qfalse; } BotAI_BotInitialChat( bs, "level_start", EasyClientName( bs->client, name, 32 ), // 0 NULL ); bs->lastchat_time = trap_AAS_Time(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotChat_HitNoKill ================== */ int BotChat_HitNoKill(bot_state_t *bs) { char name[32], *weap; float rnd; aas_entityinfo_t entinfo; if (bot_nochat.integer) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; if (BotNumActivePlayers() <= 1) return qfalse; rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_HITNOKILL, 0, 1); //don't chat in teamplay if (TeamPlayIsOn()) return qfalse; // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; //if fast chat is off if (!bot_fastchat.integer) { if (random() > rnd * 0.5) return qfalse; } if (!BotValidChatPosition(bs)) return qfalse; // if (BotVisibleEnemies(bs)) return qfalse; // BotEntityInfo(bs->enemy, &entinfo); if (EntityIsShooting(&entinfo)) return qfalse; // ClientName(bs->enemy, name, sizeof(name)); weap = BotWeaponNameForMeansOfDeath(g_entities[bs->enemy].client->lasthurt_mod); // BotAI_BotInitialChat(bs, "hit_nokill", name, weap, NULL); bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotMatch_Kill ================== */ void BotMatch_Kill(bot_state_t *bs, bot_match_t *match) { char enemy[MAX_MESSAGE_SIZE]; char netname[MAX_MESSAGE_SIZE]; int playernum; if (!TeamPlayIsOn()) return; //if not addressed to this bot if (!BotAddressedToBot(bs, match)) return; BotMatchVariable(match, ENEMY, enemy, sizeof(enemy)); // playernum = FindEnemyByName(bs, enemy); if (playernum < 0) { BotAI_BotInitialChat(bs, "whois", enemy, NULL); BotMatchVariable(match, NETNAME, netname, sizeof(netname)); playernum = PlayerFromName(netname); BotEnterChat(bs->cs, playernum, CHAT_TELL); return; } bs->teamgoal.entitynum = playernum; //set the time to send a message to the team mates bs->teammessage_time = FloatTime() + 2 * random(); //set the ltg type bs->ltgtype = LTG_KILL; //set the team goal time bs->teamgoal_time = FloatTime() + TEAM_KILL_SOMEONE; // BotSetTeamStatus(bs); BotPrintTeamGoal(bs); }
/* ================== BotChat_EnemySuicide ================== */ int BotChat_EnemySuicide(bot_state_t *bs) { char name[32]; float rnd; if (bot_nochat.integer) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; if (BotNumActivePlayers() <= 1) return qfalse; // rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_ENEMYSUICIDE, 0, 1); //don't chat in teamplay if (TeamPlayIsOn()) return qfalse; // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; //if fast chat is off if (!bot_fastchat.integer) { if (random() > rnd) return qfalse; } if (!BotValidChatPosition(bs)) return qfalse; // if (BotVisibleEnemies(bs)) return qfalse; // if (bs->enemy >= 0) EasyClientName(bs->enemy, name, 32); else strcpy(name, ""); BotAI_BotInitialChat(bs, "enemy_suicide", name, NULL); bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ======================================================================================================================================= BotMatch_Kill ======================================================================================================================================= */ void BotMatch_Kill(bot_state_t *bs, bot_match_t *match) { char enemy[MAX_MESSAGE_SIZE]; int client; if (!TeamPlayIsOn()) { return; } // if not addressed to this bot if (!BotAddressedToBot(bs, match)) { return; } trap_BotMatchVariable(match, ENEMY, enemy, sizeof(enemy)); client = FindEnemyByName(bs, enemy); if (client < 0) { BotAI_BotInitialChat(bs, "whois", enemy, NULL); trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); return; } bs->teamgoal.entitynum = client; // set the time to send a message to the team mates bs->teammessage_time = trap_AAS_Time() + 2 * random(); // set the ltg type bs->ltgtype = LTG_KILL; // set the team goal time bs->teamgoal_time = trap_AAS_Time() + TEAM_KILL_SOMEONE; #ifdef DEBUG BotPrintTeamGoal(bs); #endif // DEBUG }
/* ======================================================================================================================================= BotMatch_CheckPoint ======================================================================================================================================= */ void BotMatch_CheckPoint(bot_state_t *bs, bot_match_t *match) { int areanum; char buf[MAX_MESSAGE_SIZE]; vec3_t position; bot_waypoint_t *cp; if (!TeamPlayIsOn()) { return; } trap_BotMatchVariable(match, POSITION, buf, MAX_MESSAGE_SIZE); VectorClear(position); // BotGPSToPosition(buf, position); sscanf(buf, "%f %f %f", &position[0], &position[1], &position[2]); position[2] += 0.5; areanum = BotPointAreaNum(position); if (!areanum) { if (BotAddressedToBot(bs, match)) { BotAI_BotInitialChat(bs, "checkpoint_invalid", NULL); trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); } return; } trap_BotMatchVariable(match, NAME, buf, MAX_MESSAGE_SIZE); // check if there already exists a checkpoint with this name cp = BotFindWayPoint(bs->checkpoints, buf); if (cp) { if (cp->next) { cp->next->prev = cp->prev; } if (cp->prev) { cp->prev->next = cp->next; } else {bs->checkpoints = cp->next;} cp->inuse = qfalse; } // create a new check point cp = BotCreateWayPoint(buf, position, areanum); // add the check point to the bot's known chech points cp->next = bs->checkpoints; if (bs->checkpoints) { bs->checkpoints->prev = cp; } bs->checkpoints = cp; if (BotAddressedToBot(bs, match)) { Com_sprintf(buf, sizeof(buf), "%1.0f %1.0f %1.0f", cp->goal.origin[0], cp->goal.origin[1], cp->goal.origin[2]); BotAI_BotInitialChat(bs, "checkpoint_confirm", cp->name, buf, NULL); trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); } }
/* ================== BotChat_EndLevel ================== */ int BotChat_EndLevel(bot_state_t *bs) { char name[32]; float rnd; if (bot_nochat.integer) return qfalse; if (BotIsObserver(bs)) return qfalse; if (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) return qfalse; // teamplay if (TeamPlayIsOn()) { #ifdef MISSIONPACK if (BotIsFirstInRankings(bs)) { trap_EA_Command(bs->client, "vtaunt"); } #endif return qtrue; } // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; rnd = trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_STARTENDLEVEL, 0, 1); if (!bot_fastchat.integer) { if (random() > rnd) return qfalse; } if (BotNumActivePlayers() <= 1) return qfalse; // if (BotIsFirstInRankings(bs)) { BotAI_BotInitialChat(bs, "level_end_victory", EasyClientName(bs->client, name, 32), // 0 BotRandomOpponentName(bs), // 1 "[invalid var]", // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL); } else if (BotIsLastInRankings(bs)) { BotAI_BotInitialChat(bs, "level_end_lose", EasyClientName(bs->client, name, 32), // 0 BotRandomOpponentName(bs), // 1 BotFirstClientInRankings(), // 2 "[invalid var]", // 3 BotMapTitle(), // 4 NULL); } else { BotAI_BotInitialChat(bs, "level_end", EasyClientName(bs->client, name, 32), // 0 BotRandomOpponentName(bs), // 1 BotFirstClientInRankings(), // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL); } bs->lastchat_time = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotChat_EndLevel ================== */ int BotChat_EndLevel( bot_state_t *bs ) { char name[32]; float rnd; if ( bot_nochat.integer ) { return qfalse; } if ( BotIsObserver( bs ) ) { return qfalse; } if ( bs->lastchat_time > trap_AAS_Time() - 3 ) { return qfalse; } //don't chat in teamplay if ( TeamPlayIsOn() ) { return qfalse; } rnd = trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_STARTENDLEVEL, 0, 1 ); if ( !bot_fastchat.integer ) { if ( random() > rnd ) { return qfalse; } } if ( BotNumActivePlayers() <= 1 ) { return qfalse; } // if ( BotIsFirstInRankings( bs ) ) { BotAI_BotInitialChat( bs, "level_end_victory", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 "[invalid var]", // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL ); } else if ( BotIsLastInRankings( bs ) ) { BotAI_BotInitialChat( bs, "level_end_lose", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 BotFirstClientInRankings(), // 2 "[invalid var]", // 3 BotMapTitle(), // 4 NULL ); } else { BotAI_BotInitialChat( bs, "level_end", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 BotFirstClientInRankings(), // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL ); } bs->lastchat_time = trap_AAS_Time(); bs->chatto = CHAT_ALL; return qtrue; }
/* ================== BotMatch_WhoIsTeamLeader ================== */ void BotMatch_WhoIsTeamLeader(bot_state_t *bs, bot_match_t *match) { char netname[MAX_MESSAGE_SIZE]; if (!TeamPlayIsOn()) return; ClientName(bs->client, netname, sizeof(netname)); //if this bot IS the team leader if (!Q_stricmp(netname, bs->teamleader)) { trap_EA_SayTeam(bs->client, "I'm the team leader\n"); } }
/* ================== BotMatch_LeaveSubteam ================== */ void BotMatch_WhichTeam(bot_state_t *bs, bot_match_t *match) { if (!TeamPlayIsOn()) return; //if not addressed to this bot if (!BotAddressedToBot(bs, match)) return; // if (strlen(bs->subteam)) { BotAI_BotInitialChat(bs, "inteam", bs->subteam, NULL); } else { BotAI_BotInitialChat(bs, "noteam", NULL); } trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); }
/* ================== BotVoiceChat_WhoIsLeader ================== */ void BotVoiceChat_WhoIsLeader(bot_state_t *bs, int client, int mode) { char netname[MAX_MESSAGE_SIZE]; if (!TeamPlayIsOn()) return; ClientName(bs->client, netname, sizeof(netname)); //if this bot IS the team leader if (!Q_stricmp(netname, bs->teamleader)) { BotAI_BotInitialChat(bs, "iamteamleader", NULL); trap_BotEnterChat(bs->cs, 0, CHAT_TEAM); BotVoiceChatOnly(bs, -1, VOICECHAT_STARTLEADER); } }
/* ======================================================================================================================================= BotMatch_Dismiss ======================================================================================================================================= */ void BotMatch_Dismiss(bot_state_t *bs, bot_match_t *match) { if (!TeamPlayIsOn()) { return; } // if not addressed to this bot if (!BotAddressedToBot(bs, match)) { return; } bs->ltgtype = 0; bs->lead_time = 0; BotAI_BotInitialChat(bs, "dismissed", NULL); trap_BotEnterChat(bs->cs, bs->client, CHAT_TEAM); }