📄 ai_chat.c
字号:
/*
==================
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;
}
/*
==================
BotChat_ExitGame
==================
*/
int BotChat_ExitGame(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;
//
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 = FloatTime();
bs->chatto = CHAT_ALL;
return qtrue;
}
/*
==================
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()) {
trap_EA_Command(bs->client, "vtaunt");
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;
}
/*
==================
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())
{
if (BotIsFirstInRankings(bs)) {
trap_EA_Command(bs->client, "vtaunt");
}
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_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()) {
trap_EA_Command(bs->client, "vtaunt");
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_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()) {
trap_EA_Command(bs->client, "vtaunt");
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_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_KILL, 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;
}
/*
==================
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_client);
//
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], *weap;
float rnd;
int lasthurt_client;
aas_entityinfo_t entinfo;
lasthurt_client = g_entities[bs->client].client->lasthurt_client;
if (!lasthurt_client) return qfalse;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -