/* ================== 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; }
/* ================== 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_Death ================== */ int BotChat_Death( 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_DEATH, 0, 1 ); //if fast chatting is off if ( !bot_fastchat.integer ) { if ( random() > rnd ) { return qfalse; } } if ( BotNumActivePlayers() <= 1 ) { return qfalse; } // if ( bs->lastkilledby >= 0 && bs->lastkilledby < MAX_CLIENTS ) { EasyClientName( bs->lastkilledby, name, 32 ); } else { strcpy( name, "[world]" ); } // if ( TeamPlayIsOn() && BotSameTeam( bs, bs->lastkilledby ) ) { if ( bs->lastkilledby == bs->client ) { return qfalse; } BotAI_BotInitialChat( bs, "death_teammate", name, NULL ); bs->chatto = CHAT_TEAM; } else { //don't chat in teamplay if ( TeamPlayIsOn() ) { return qfalse; } // if ( bs->botdeathtype == MOD_WATER ) { BotAI_BotInitialChat( bs, "death_drown", BotRandomOpponentName( bs ), NULL ); } else if ( bs->botdeathtype == MOD_SLIME ) { BotAI_BotInitialChat( bs, "death_slime", BotRandomOpponentName( bs ), NULL ); } else if ( bs->botdeathtype == MOD_LAVA ) { BotAI_BotInitialChat( bs, "death_lava", BotRandomOpponentName( bs ), NULL ); } else if ( bs->botdeathtype == MOD_FALLING ) { BotAI_BotInitialChat( bs, "death_cratered", BotRandomOpponentName( bs ), NULL ); } else if ( bs->botsuicide || //all other suicides by own weapon bs->botdeathtype == MOD_CRUSH || bs->botdeathtype == MOD_SUICIDE || bs->botdeathtype == MOD_TARGET_LASER || bs->botdeathtype == MOD_TRIGGER_HURT || bs->botdeathtype == MOD_UNKNOWN ) { BotAI_BotInitialChat( bs, "death_suicide", BotRandomOpponentName( bs ), NULL ); } else if ( bs->botdeathtype == MOD_TELEFRAG ) { BotAI_BotInitialChat( bs, "death_telefrag", name, NULL ); } else { if ( ( bs->botdeathtype == MOD_GAUNTLET || bs->botdeathtype == MOD_RAILGUN || bs->botdeathtype == MOD_BFG || bs->botdeathtype == MOD_BFG_SPLASH ) && random() < 0.5 ) { if ( bs->botdeathtype == MOD_GAUNTLET ) { BotAI_BotInitialChat( bs, "death_gauntlet", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); } else if ( bs->botdeathtype == MOD_RAILGUN ) { BotAI_BotInitialChat( bs, "death_rail", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); } else { BotAI_BotInitialChat( bs, "death_bfg", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); } } //choose between insult and praise else if ( random() < trap_Characteristic_BFloat( bs->character, CHARACTERISTIC_CHAT_INSULT, 0, 1 ) ) { BotAI_BotInitialChat( bs, "death_insult", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); } else { BotAI_BotInitialChat( bs, "death_praise", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); } } bs->chatto = CHAT_ALL; } bs->lastchat_time = trap_AAS_Time(); return qtrue; }
/* ================== BotChatTest ================== */ void BotChatTest( bot_state_t *bs ) { char name[32]; char *weap; int num, i; num = trap_BotNumInitialChats( bs->cs, "game_enter" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "game_enter", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 "[invalid var]", // 2 "[invalid var]", // 3 BotMapTitle(), // 4 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "game_exit" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "game_exit", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 "[invalid var]", // 2 "[invalid var]", // 3 BotMapTitle(), // 4 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "level_start" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "level_start", EasyClientName( bs->client, name, 32 ), // 0 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "level_end_victory" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "level_end_victory", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 BotFirstClientInRankings(), // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "level_end_lose" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "level_end_lose", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 BotFirstClientInRankings(), // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "level_end" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "level_end", EasyClientName( bs->client, name, 32 ), // 0 BotRandomOpponentName( bs ), // 1 BotFirstClientInRankings(), // 2 BotLastClientInRankings(), // 3 BotMapTitle(), // 4 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } EasyClientName( bs->lastkilledby, name, sizeof( name ) ); num = trap_BotNumInitialChats( bs->cs, "death_drown" ); for ( i = 0; i < num; i++ ) { // BotAI_BotInitialChat( bs, "death_drown", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_slime" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_slime", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_lava" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_lava", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_cratered" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_cratered", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_suicide" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_suicide", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_telefrag" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_telefrag", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_gauntlet" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_gauntlet", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_rail" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_rail", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_bfg" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_bfg", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_insult" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_insult", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "death_praise" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "death_praise", name, // 0 BotWeaponNameForMeansOfDeath( bs->botdeathtype ), // 1 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } // EasyClientName( bs->lastkilledplayer, name, 32 ); // num = trap_BotNumInitialChats( bs->cs, "kill_gauntlet" ); for ( i = 0; i < num; i++ ) { // BotAI_BotInitialChat( bs, "kill_gauntlet", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "kill_rail" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "kill_rail", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "kill_telefrag" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "kill_telefrag", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "kill_insult" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "kill_insult", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "kill_praise" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "kill_praise", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "enemy_suicide" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "enemy_suicide", name, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } ClientName( g_entities[bs->client].client->lasthurt_client, name, sizeof( name ) ); weap = BotWeaponNameForMeansOfDeath( g_entities[bs->client].client->lasthurt_client ); num = trap_BotNumInitialChats( bs->cs, "hit_talking" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "hit_talking", name, weap, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "hit_nodeath" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "hit_nodeath", name, weap, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "hit_nokill" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "hit_nokill", name, weap, NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } // if ( bs->lastkilledplayer == bs->client ) { strcpy( name, BotRandomOpponentName( bs ) ); } else { EasyClientName( bs->lastkilledplayer, name, sizeof( name ) ); } // num = trap_BotNumInitialChats( bs->cs, "random_misc" ); for ( i = 0; i < num; i++ ) { // BotAI_BotInitialChat( bs, "random_misc", BotRandomOpponentName( bs ), // 0 name, // 1 "[invalid var]", // 2 "[invalid var]", // 3 BotMapTitle(), // 4 BotRandomWeaponName(), // 5 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } num = trap_BotNumInitialChats( bs->cs, "random_insult" ); for ( i = 0; i < num; i++ ) { BotAI_BotInitialChat( bs, "random_insult", BotRandomOpponentName( bs ), // 0 name, // 1 "[invalid var]", // 2 "[invalid var]", // 3 BotMapTitle(), // 4 BotRandomWeaponName(), // 5 NULL ); trap_BotEnterChat( bs->cs, bs->client, CHAT_ALL ); } }
/* ================== BotChat_Death ================== */ int BotChat_Death(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_DEATH, 0, 1); // don't chat in tournament mode if (gametype == GT_TOURNAMENT) return qfalse; //if fast chatting is off if (!bot_fastchat.integer) { if (random() > rnd) return qfalse; } if (BotNumActivePlayers() <= 1) return qfalse; // if (bs->lastkilledby >= 0 && bs->lastkilledby < MAX_CLIENTS) EasyClientName(bs->lastkilledby, name, 32); else strcpy(name, "[world]"); // if (TeamPlayIsOn() && BotSameTeam(bs, bs->lastkilledby)) { if (bs->lastkilledby == bs->client) return qfalse; BotAI_BotInitialChat(bs, "death_teammate", name, NULL); bs->chatto = CHAT_TEAM; } else { //teamplay if (TeamPlayIsOn()) { #ifdef MISSIONPACK trap_EA_Command(bs->client, "vtaunt"); #endif return qtrue; } // if (bs->botdeathtype == MOD_WATER) BotAI_BotInitialChat(bs, "death_drown", BotRandomOpponentName(bs), NULL); else if (bs->botdeathtype == MOD_SLIME) BotAI_BotInitialChat(bs, "death_slime", BotRandomOpponentName(bs), NULL); else if (bs->botdeathtype == MOD_LAVA) BotAI_BotInitialChat(bs, "death_lava", BotRandomOpponentName(bs), NULL); else if (bs->botdeathtype == MOD_FALLING) BotAI_BotInitialChat(bs, "death_cratered", BotRandomOpponentName(bs), NULL); else if (bs->botsuicide || //all other suicides by own weapon bs->botdeathtype == MOD_CRUSH || bs->botdeathtype == MOD_SUICIDE || bs->botdeathtype == MOD_TARGET_LASER || bs->botdeathtype == MOD_TRIGGER_HURT || bs->botdeathtype == MOD_UNKNOWN) BotAI_BotInitialChat(bs, "death_suicide", BotRandomOpponentName(bs), NULL); else if (bs->botdeathtype == MOD_TELEFRAG) BotAI_BotInitialChat(bs, "death_telefrag", name, NULL); #ifdef MISSIONPACK else if (bs->botdeathtype == MOD_KAMIKAZE && trap_BotNumInitialChats(bs->cs, "death_kamikaze")) BotAI_BotInitialChat(bs, "death_kamikaze", name, NULL); #endif else { if ((bs->botdeathtype == MOD_GAUNTLET || bs->botdeathtype == MOD_RAILGUN || bs->botdeathtype == MOD_BFG || bs->botdeathtype == MOD_BFG_SPLASH) && random() < 0.5) { if (bs->botdeathtype == MOD_GAUNTLET) BotAI_BotInitialChat(bs, "death_gauntlet", name, // 0 BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 NULL); else if (bs->botdeathtype == MOD_RAILGUN) BotAI_BotInitialChat(bs, "death_rail", name, // 0 BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 NULL); else BotAI_BotInitialChat(bs, "death_bfg", name, // 0 BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 NULL); } //choose between insult and praise else if (random() < trap_Characteristic_BFloat(bs->character, CHARACTERISTIC_CHAT_INSULT, 0, 1)) { BotAI_BotInitialChat(bs, "death_insult", name, // 0 BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 NULL); } else { BotAI_BotInitialChat(bs, "death_praise", name, // 0 BotWeaponNameForMeansOfDeath(bs->botdeathtype), // 1 NULL); } } bs->chatto = CHAT_ALL; } bs->lastchat_time = FloatTime(); return qtrue; }
/* ======================================================================================================================================= BotChat_HitNoDeath ======================================================================================================================================= */ int BotChat_HitNoDeath(bot_state_t *bs) { char name[32], *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 (bs->lastchat_time > FloatTime() - TIME_BETWEENCHATTING) { 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; } // don't chat in tournament mode if (gametype == GT_TOURNAMENT) { return qfalse; } if (random() > rnd * 0.5) { return qfalse; } if (!BotValidChatPosition(bs)) { return qfalse; } if (BotVisibleEnemies(bs)) { return qfalse; } if (bs->enemy >= MAX_CLIENTS) { return qfalse; } if (bs->enemy >= 0) { // get the entity information 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 = FloatTime(); bs->chatto = CHAT_ALL; return qtrue; }