/* ================== BotChat_HitNoKill ================== */ int BotChat_HitNoKill( bot_state_t *bs ) { char name[32]; const char* weap; float rnd; aas_entityinfo_t entinfo; 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_HITNOKILL, 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( 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 = trap_AAS_Time(); bs->chatto = CHAT_ALL; return qtrue; }
/* ======================================================================================================================================= BotVisibleEnemies ======================================================================================================================================= */ int BotVisibleEnemies(bot_state_t *bs) { int i; aas_entityinfo_t entinfo; for (i = 0; i < level.maxclients; i++) { if (i == bs->client) { continue; } // if on the same team if (BotSameTeam(bs, i)) { continue; } // get the entity information BotEntityInfo(i, &entinfo); // if this player is active if (!entinfo.valid) { continue; } // if the entity isn't the bot self if (entinfo.number == bs->entitynum) { continue; } // if the entity isn't dead if (EntityIsDead(&entinfo)) { continue; } // if the enemy is invisible if (EntityIsInvisible(&entinfo)) { continue; } // check if the enemy is visible if (BotEntityVisible(&bs->cur_ps, 360, i)) { return qtrue; } } return qfalse; }