mirror of
https://github.com/ReactionQuake3/reaction.git
synced 2024-11-11 15:52:30 +00:00
Improved door code. Bots reply to radio treport from teammates.
Improved reloading code.
This commit is contained in:
parent
09097ec59a
commit
ab15281ede
4 changed files with 134 additions and 33 deletions
|
@ -5,8 +5,13 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.6 2002/04/04 18:06:44 makro
|
||||||
|
// Improved door code. Bots reply to radio treport from teammates.
|
||||||
|
// Improved reloading code.
|
||||||
|
//
|
||||||
// Revision 1.5 2002/03/31 19:16:56 makro
|
// Revision 1.5 2002/03/31 19:16:56 makro
|
||||||
// Bandaging, reloading, opening rotating doors (still needs a lot of), shooting breakables
|
// Bandaging, reloading, opening rotating doors (still needs a lot of work),
|
||||||
|
// shooting breakables
|
||||||
//
|
//
|
||||||
// Revision 1.4 2002/01/11 19:48:29 jbravo
|
// Revision 1.4 2002/01/11 19:48:29 jbravo
|
||||||
// Formatted the source in non DOS format.
|
// Formatted the source in non DOS format.
|
||||||
|
@ -305,9 +310,12 @@ int NumPlayersOnSameTeam(bot_state_t *bs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
====================================
|
||||||
TeamPlayIsOn
|
BotGetPatrolWaypoints
|
||||||
==================
|
|
||||||
|
Makro - description was wrong
|
||||||
|
(TeamPlayIsOn)
|
||||||
|
====================================
|
||||||
*/
|
*/
|
||||||
int BotGetPatrolWaypoints(bot_state_t *bs, bot_match_t *match) {
|
int BotGetPatrolWaypoints(bot_state_t *bs, bot_match_t *match) {
|
||||||
char keyarea[MAX_MESSAGE_SIZE];
|
char keyarea[MAX_MESSAGE_SIZE];
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.12 2002/04/04 18:06:44 makro
|
||||||
|
// Improved door code. Bots reply to radio treport from teammates.
|
||||||
|
// Improved reloading code.
|
||||||
|
//
|
||||||
// Revision 1.11 2002/04/03 17:39:36 makro
|
// Revision 1.11 2002/04/03 17:39:36 makro
|
||||||
// Made bots handle incoming radio spam better
|
// Made bots handle incoming radio spam better
|
||||||
//
|
//
|
||||||
|
@ -15,7 +19,8 @@
|
||||||
// Changed some weapon names
|
// Changed some weapon names
|
||||||
//
|
//
|
||||||
// Revision 1.7 2002/03/31 19:16:56 makro
|
// Revision 1.7 2002/03/31 19:16:56 makro
|
||||||
// Bandaging, reloading, opening rotating doors (still needs a lot of), shooting breakables
|
// Bandaging, reloading, opening rotating doors (still needs a lot of work),
|
||||||
|
// shooting breakables
|
||||||
//
|
//
|
||||||
// Revision 1.6 2002/01/11 19:48:29 jbravo
|
// Revision 1.6 2002/01/11 19:48:29 jbravo
|
||||||
// Formatted the source in non DOS format.
|
// Formatted the source in non DOS format.
|
||||||
|
@ -72,6 +77,8 @@
|
||||||
//Makro - to get rid of the warnings
|
//Makro - to get rid of the warnings
|
||||||
void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist);
|
void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist);
|
||||||
void Cmd_Bandage (gentity_t *ent);
|
void Cmd_Bandage (gentity_t *ent);
|
||||||
|
gentity_t *SelectRandomDeathmatchSpawnPoint( void );
|
||||||
|
void BotAttack(bot_state_t *bs);
|
||||||
|
|
||||||
//goal flag, see be_ai_goal.h for the other GFL_*
|
//goal flag, see be_ai_goal.h for the other GFL_*
|
||||||
#define GFL_AIR 128
|
#define GFL_AIR 128
|
||||||
|
@ -1293,6 +1300,15 @@ int AINode_Respawn(bot_state_t *bs) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
trap_EA_Respawn(bs->client);
|
trap_EA_Respawn(bs->client);
|
||||||
|
//Makro - maybe this will help in teamplay
|
||||||
|
if (gametype == GT_TEAMPLAY) {
|
||||||
|
gentity_t *spot = SelectRandomDeathmatchSpawnPoint();
|
||||||
|
aas_entityinfo_t entinfo;
|
||||||
|
|
||||||
|
BotEntityInfo(spot-g_entities, &entinfo);
|
||||||
|
BotMoveTo(bs, entinfo.origin);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (bs->respawn_time < FloatTime()) {
|
else if (bs->respawn_time < FloatTime()) {
|
||||||
|
@ -1387,7 +1403,9 @@ void BotClearPath(bot_state_t *bs, bot_moveresult_t *moveresult) {
|
||||||
// if the mine is visible from the current position
|
// if the mine is visible from the current position
|
||||||
if (bsptrace.fraction >= 1.0 || bsptrace.ent == state.number) {
|
if (bsptrace.fraction >= 1.0 || bsptrace.ent == state.number) {
|
||||||
// shoot at the mine
|
// shoot at the mine
|
||||||
trap_EA_Attack(bs->client);
|
//Makro - using custom function to allow in-combat reloads
|
||||||
|
//trap_EA_Attack(bs->client);
|
||||||
|
BotAttack(bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1446,7 +1464,9 @@ void BotClearPath(bot_state_t *bs, bot_moveresult_t *moveresult) {
|
||||||
// if the mine is visible from the current position
|
// if the mine is visible from the current position
|
||||||
if (bsptrace.fraction >= 1.0 || bsptrace.ent == state.number) {
|
if (bsptrace.fraction >= 1.0 || bsptrace.ent == state.number) {
|
||||||
// shoot at the mine
|
// shoot at the mine
|
||||||
trap_EA_Attack(bs->client);
|
//Makro - using custom function to allow in-combat reloads
|
||||||
|
//trap_EA_Attack(bs->client);
|
||||||
|
BotAttack(bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1550,7 +1570,9 @@ int AINode_Seek_ActivateEntity(bot_state_t *bs) {
|
||||||
vectoangles(dir, ideal_viewangles);
|
vectoangles(dir, ideal_viewangles);
|
||||||
// if the bot is pretty close with it's aim
|
// if the bot is pretty close with it's aim
|
||||||
if (InFieldOfVision(bs->viewangles, 20, ideal_viewangles)) {
|
if (InFieldOfVision(bs->viewangles, 20, ideal_viewangles)) {
|
||||||
trap_EA_Attack(bs->client);
|
//Makro - using custom function to allow in-combat reloads
|
||||||
|
//trap_EA_Attack(bs->client);
|
||||||
|
BotAttack(bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.15 2002/04/04 18:06:44 makro
|
||||||
|
// Improved door code. Bots reply to radio treport from teammates.
|
||||||
|
// Improved reloading code.
|
||||||
|
//
|
||||||
// Revision 1.14 2002/04/03 17:46:14 makro
|
// Revision 1.14 2002/04/03 17:46:14 makro
|
||||||
// Fixed one more thing
|
// Fixed one more thing
|
||||||
//
|
//
|
||||||
|
@ -18,7 +22,8 @@
|
||||||
// Changed some weapon names
|
// Changed some weapon names
|
||||||
//
|
//
|
||||||
// Revision 1.9 2002/03/31 19:16:56 makro
|
// Revision 1.9 2002/03/31 19:16:56 makro
|
||||||
// Bandaging, reloading, opening rotating doors (still needs a lot of), shooting breakables
|
// Bandaging, reloading, opening rotating doors (still needs a lot of work),
|
||||||
|
// shooting breakables
|
||||||
//
|
//
|
||||||
// Revision 1.8 2002/03/18 12:25:10 jbravo
|
// Revision 1.8 2002/03/18 12:25:10 jbravo
|
||||||
// Live players dont get fraglines, except their own. Cleanups and some
|
// Live players dont get fraglines, except their own. Cleanups and some
|
||||||
|
@ -144,6 +149,59 @@ void VectorTargetDist(vec3_t src, vec3_t dest, int dist, vec3_t final) {
|
||||||
VectorAdd(final, src, final);
|
VectorAdd(final, src, final);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
BotAttack
|
||||||
|
|
||||||
|
Added by Makro
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
void BotAttack(bot_state_t *bs) {
|
||||||
|
//If the gun is empty
|
||||||
|
if ( (bs->cur_ps.ammo[bs->weaponnum]) == 0 ) {
|
||||||
|
//If bot has extra clips, reload
|
||||||
|
if (g_entities[bs->entitynum].client->numClips[bs->weaponnum] >= 1 ) {
|
||||||
|
//Cmd_Reload( &g_entities[bs->entitynum] );
|
||||||
|
trap_EA_Action(bs->client, ACTION_AFFIRMATIVE);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
trap_EA_Attack(bs->client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==================
|
||||||
|
BotMoveTo
|
||||||
|
|
||||||
|
Added by Makro
|
||||||
|
==================
|
||||||
|
*/
|
||||||
|
bot_moveresult_t BotMoveTo(bot_state_t *bs, vec3_t dest) {
|
||||||
|
bot_goal_t goal;
|
||||||
|
bot_moveresult_t moveresult;
|
||||||
|
|
||||||
|
//create goal
|
||||||
|
goal.entitynum = 0;
|
||||||
|
VectorCopy(dest, goal.origin);
|
||||||
|
VectorSet(goal.mins, -8, -8, -8);
|
||||||
|
VectorSet(goal.maxs, 8, 8, 8);
|
||||||
|
VectorAdd(goal.mins, goal.origin, goal.mins);
|
||||||
|
VectorAdd(goal.maxs, goal.origin, goal.maxs);
|
||||||
|
goal.areanum = trap_AAS_PointAreaNum(goal.origin);
|
||||||
|
//initialize the movement state
|
||||||
|
BotSetupForMovement(bs);
|
||||||
|
//trap_BotMoveInDirection(bs->ms, dir, dist, MOVE_RUN);
|
||||||
|
|
||||||
|
//move towards the goal
|
||||||
|
trap_BotMoveToGoal(&moveresult, bs->ms, &goal, TFL_DEFAULT);
|
||||||
|
//if movement failed
|
||||||
|
if (moveresult.failure) {
|
||||||
|
//reset the avoid reach, otherwise bot is stuck in current area
|
||||||
|
trap_BotResetAvoidReach(bs->ms);
|
||||||
|
bs->activatestack->time = 0;
|
||||||
|
}
|
||||||
|
return moveresult;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
BotMoveTowardsEnt
|
BotMoveTowardsEnt
|
||||||
|
@ -153,8 +211,6 @@ Added by Makro
|
||||||
*/
|
*/
|
||||||
void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist) {
|
void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist) {
|
||||||
vec3_t dir;
|
vec3_t dir;
|
||||||
bot_goal_t goal;
|
|
||||||
bot_moveresult_t moveresult;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
VectorClear(dir);
|
VectorClear(dir);
|
||||||
|
@ -168,15 +224,7 @@ void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist) {
|
||||||
VectorAdd(dir, bs->origin, dir);
|
VectorAdd(dir, bs->origin, dir);
|
||||||
*/
|
*/
|
||||||
VectorTargetDist(bs->origin, dest, dist, dir);
|
VectorTargetDist(bs->origin, dest, dist, dir);
|
||||||
//trap_BotMoveInDirection(bs->ms, dir, dist, MOVE_RUN);
|
dir[2] = bs->origin[2];
|
||||||
|
|
||||||
//create goal
|
|
||||||
memset(&moveresult, 0, sizeof(moveresult));
|
|
||||||
goal.entitynum = 0;
|
|
||||||
VectorCopy(dir, goal.origin);
|
|
||||||
VectorSet(goal.mins, -8, -8, -8);
|
|
||||||
VectorSet(goal.maxs, 8, 8, 8);
|
|
||||||
goal.areanum = trap_AAS_PointAreaNum(goal.origin);
|
|
||||||
/*
|
/*
|
||||||
if (bot_developer.integer == 2) {
|
if (bot_developer.integer == 2) {
|
||||||
G_Printf(va("^5BOT CODE: ^7Moving from (%i %i %i) towards entity at (%i %i %i) up to (%i %i %i)\n",
|
G_Printf(va("^5BOT CODE: ^7Moving from (%i %i %i) towards entity at (%i %i %i) up to (%i %i %i)\n",
|
||||||
|
@ -185,13 +233,7 @@ void BotMoveTowardsEnt(bot_state_t *bs, vec3_t dest, int dist) {
|
||||||
(int) dir[0], (int) dir[1], (int) dir[2]));
|
(int) dir[0], (int) dir[1], (int) dir[2]));
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
//initialize the movement state
|
BotMoveTo(bs, dir);
|
||||||
BotSetupForMovement(bs);
|
|
||||||
//move towards the goal
|
|
||||||
trap_BotMoveToGoal(&moveresult, bs->ms, &goal, TFL_DEFAULT);
|
|
||||||
|
|
||||||
//moveresult->failure = qfalse;
|
|
||||||
//VectorCopy(dir, moveresult->movedir);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1669,7 +1711,8 @@ void BotChooseWeapon(bot_state_t *bs) {
|
||||||
//Makro - gun is empty; if bot has extra clips - reload, otherwise switch to knife
|
//Makro - gun is empty; if bot has extra clips - reload, otherwise switch to knife
|
||||||
if ( (bs->cur_ps.ammo[bs->weaponnum]) == 0 ) {
|
if ( (bs->cur_ps.ammo[bs->weaponnum]) == 0 ) {
|
||||||
if (g_entities[bs->entitynum].client->numClips[bs->weaponnum] >= 1 ) {
|
if (g_entities[bs->entitynum].client->numClips[bs->weaponnum] >= 1 ) {
|
||||||
Cmd_Reload( &g_entities[bs->entitynum] );
|
//Cmd_Reload( &g_entities[bs->entitynum] );
|
||||||
|
trap_EA_Action(bs->client, ACTION_AFFIRMATIVE);
|
||||||
/*
|
/*
|
||||||
if (bot_developer.integer == 2) {
|
if (bot_developer.integer == 2) {
|
||||||
G_Printf("^5BOT CODE: ^7Reloading\n");
|
G_Printf("^5BOT CODE: ^7Reloading\n");
|
||||||
|
@ -3810,11 +3853,15 @@ void BotCheckAttack(bot_state_t *bs) {
|
||||||
//if fire has to be release to activate weapon
|
//if fire has to be release to activate weapon
|
||||||
if (wi.flags & WFL_FIRERELEASED) {
|
if (wi.flags & WFL_FIRERELEASED) {
|
||||||
if (bs->flags & BFL_ATTACKED) {
|
if (bs->flags & BFL_ATTACKED) {
|
||||||
trap_EA_Attack(bs->client);
|
//Makro - using custom function to allow in-combat reloads
|
||||||
|
//trap_EA_Attack(bs->client);
|
||||||
|
BotAttack(bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
trap_EA_Attack(bs->client);
|
//Makro - using custom function to allow in-combat reloads
|
||||||
|
//trap_EA_Attack(bs->client);
|
||||||
|
BotAttack(bs);
|
||||||
}
|
}
|
||||||
bs->flags ^= BFL_ATTACKED;
|
bs->flags ^= BFL_ATTACKED;
|
||||||
}
|
}
|
||||||
|
@ -3888,7 +3935,9 @@ void BotMapScripts(bot_state_t *bs) {
|
||||||
bs->ideal_viewangles[YAW] = AngleMod(bs->ideal_viewangles[YAW]);
|
bs->ideal_viewangles[YAW] = AngleMod(bs->ideal_viewangles[YAW]);
|
||||||
//
|
//
|
||||||
if (InFieldOfVision(bs->viewangles, 20, bs->ideal_viewangles)) {
|
if (InFieldOfVision(bs->viewangles, 20, bs->ideal_viewangles)) {
|
||||||
trap_EA_Attack(bs->client);
|
//Makro - using custom function to allow in-combat reloads
|
||||||
|
//trap_EA_Attack(bs->client);
|
||||||
|
BotAttack(bs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4874,6 +4923,11 @@ Added by Makro
|
||||||
*/
|
*/
|
||||||
void BotReplyToRadioMessage( bot_state_t *bs, char *msg, int handle ) {
|
void BotReplyToRadioMessage( bot_state_t *bs, char *msg, int handle ) {
|
||||||
|
|
||||||
|
//Must be in a team-based game to reply
|
||||||
|
if (gametype < GT_TEAM) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//Bot must be alive to report
|
//Bot must be alive to report
|
||||||
if (!BotIsDead(bs)) {
|
if (!BotIsDead(bs)) {
|
||||||
char *token;
|
char *token;
|
||||||
|
@ -4899,6 +4953,12 @@ void BotReplyToRadioMessage( bot_state_t *bs, char *msg, int handle ) {
|
||||||
char *sender = COM_ParseExt(&msg, qtrue);
|
char *sender = COM_ParseExt(&msg, qtrue);
|
||||||
qboolean responded = qfalse;
|
qboolean responded = qfalse;
|
||||||
|
|
||||||
|
//Lazy bots
|
||||||
|
if ( random() < 0.5 ) {
|
||||||
|
//sender = Q_strlwr(sender);
|
||||||
|
EasyClientName(ClientFromName(sender), sender, 32);
|
||||||
|
}
|
||||||
|
|
||||||
if (strstr(msg, "treport")) {
|
if (strstr(msg, "treport")) {
|
||||||
//Team, report in
|
//Team, report in
|
||||||
G_Say( &g_entities[bs->entitynum], NULL, SAY_TEAM, va("%s, I have a $W with $A ammo and $H health", sender));
|
G_Say( &g_entities[bs->entitynum], NULL, SAY_TEAM, va("%s, I have a $W with $A ammo and $H health", sender));
|
||||||
|
@ -4932,6 +4992,11 @@ qboolean BotCheckRadioMessage( bot_state_t *bs, char *msg, int handle ) {
|
||||||
char *token;
|
char *token;
|
||||||
char *initial = msg;
|
char *initial = msg;
|
||||||
|
|
||||||
|
//Must be in a team-based game to reply
|
||||||
|
if (gametype < GT_TEAM) {
|
||||||
|
return qfalse;
|
||||||
|
}
|
||||||
|
|
||||||
token = COM_ParseExt(&msg, qtrue);
|
token = COM_ParseExt(&msg, qtrue);
|
||||||
msg = initial;
|
msg = initial;
|
||||||
if ( !Q_stricmp(token, "radio") ) {
|
if ( !Q_stricmp(token, "radio") ) {
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.5 2002/04/04 18:06:44 makro
|
||||||
|
// Improved door code. Bots reply to radio treport from teammates.
|
||||||
|
// Improved reloading code.
|
||||||
|
//
|
||||||
// Revision 1.4 2002/01/11 19:48:29 jbravo
|
// Revision 1.4 2002/01/11 19:48:29 jbravo
|
||||||
// Formatted the source in non DOS format.
|
// Formatted the source in non DOS format.
|
||||||
//
|
//
|
||||||
|
@ -468,7 +472,8 @@ void BotVoiceChat_WantOnDefense(bot_state_t *bs, int client, int mode) {
|
||||||
BotAI_BotInitialChat(bs, "keepinmind", netname, NULL);
|
BotAI_BotInitialChat(bs, "keepinmind", netname, NULL);
|
||||||
trap_BotEnterChat(bs->cs, client, CHAT_TELL);
|
trap_BotEnterChat(bs->cs, client, CHAT_TELL);
|
||||||
BotVoiceChatOnly(bs, client, VOICECHAT_YES);
|
BotVoiceChatOnly(bs, client, VOICECHAT_YES);
|
||||||
trap_EA_Action(bs->client, ACTION_AFFIRMATIVE);
|
//Makro - BUTTON_AFFIRMATIVE is now used for reloading
|
||||||
|
//trap_EA_Action(bs->client, ACTION_AFFIRMATIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -489,7 +494,8 @@ void BotVoiceChat_WantOnOffense(bot_state_t *bs, int client, int mode) {
|
||||||
BotAI_BotInitialChat(bs, "keepinmind", netname, NULL);
|
BotAI_BotInitialChat(bs, "keepinmind", netname, NULL);
|
||||||
trap_BotEnterChat(bs->cs, client, CHAT_TELL);
|
trap_BotEnterChat(bs->cs, client, CHAT_TELL);
|
||||||
BotVoiceChatOnly(bs, client, VOICECHAT_YES);
|
BotVoiceChatOnly(bs, client, VOICECHAT_YES);
|
||||||
trap_EA_Action(bs->client, ACTION_AFFIRMATIVE);
|
//Makro - BUTTON_AFFIRMATIVE is now used for reloading
|
||||||
|
//trap_EA_Action(bs->client, ACTION_AFFIRMATIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BotVoiceChat_Dummy(bot_state_t *bs, int client, int mode) {
|
void BotVoiceChat_Dummy(bot_state_t *bs, int client, int mode) {
|
||||||
|
|
Loading…
Reference in a new issue