mirror of
https://github.com/ENSL/NS.git
synced 2024-11-15 01:11:43 +00:00
814 lines
25 KiB
C++
814 lines
25 KiB
C++
|
//
|
||
|
// HPB bot - botman's High Ping Bastard bot
|
||
|
//
|
||
|
// (http://planethalflife.com/botman/)
|
||
|
//
|
||
|
// bot_start.cpp
|
||
|
//
|
||
|
|
||
|
#include "extdll.h"
|
||
|
#include "util.h"
|
||
|
#include "cbase.h"
|
||
|
|
||
|
#include "bot.h"
|
||
|
#include "bot_func.h"
|
||
|
#include "bot_weapons.h"
|
||
|
#include "mod/AvHMessage.h"
|
||
|
|
||
|
extern int mod_id;
|
||
|
extern edict_t *pent_info_ctfdetect;
|
||
|
|
||
|
extern int max_team_players[4];
|
||
|
extern int team_class_limits[4];
|
||
|
extern int max_teams;
|
||
|
|
||
|
|
||
|
void BotStartGame( bot_t *pBot )
|
||
|
{
|
||
|
char c_team[32];
|
||
|
char c_class[32];
|
||
|
char c_item[32];
|
||
|
int index, count, retry_count;
|
||
|
edict_t *pPlayer;
|
||
|
int team;
|
||
|
int class_not_allowed;
|
||
|
|
||
|
edict_t *pEdict = pBot->pEdict;
|
||
|
|
||
|
//CBaseEntity* theEntity = CBaseEntity::Instance(pEdict);
|
||
|
//AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theEntity);
|
||
|
|
||
|
if (mod_id == TFC_DLL)
|
||
|
{
|
||
|
if ((pBot->start_action == MSG_TFC_IDLE) &&
|
||
|
(pBot->create_time + 3.0 <= gpGlobals->time))
|
||
|
{
|
||
|
pBot->start_action = MSG_TFC_TEAM_SELECT; // force team selection
|
||
|
}
|
||
|
|
||
|
// handle Team Fortress Classic stuff here...
|
||
|
|
||
|
if (pBot->start_action == MSG_TFC_TEAM_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_TFC_IDLE; // switch back to idle
|
||
|
pBot->create_time = gpGlobals->time; // reset
|
||
|
|
||
|
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
|
||
|
(pBot->bot_team != 3) && (pBot->bot_team != 4) &&
|
||
|
(pBot->bot_team != 5))
|
||
|
pBot->bot_team = -1;
|
||
|
|
||
|
if (pBot->bot_team == -1)
|
||
|
pBot->bot_team = RANDOM_LONG(1, max_teams);
|
||
|
|
||
|
retry_count = 0;
|
||
|
|
||
|
while ((retry_count < 4) &&
|
||
|
(max_team_players[pBot->bot_team-1] > 0)) // not unlimited?
|
||
|
{
|
||
|
count = 0;
|
||
|
|
||
|
// count number of players on this team...
|
||
|
for (index = 1; index <= gpGlobals->maxClients; index++)
|
||
|
{
|
||
|
pPlayer = INDEXENT(index);
|
||
|
|
||
|
if (pPlayer && !pPlayer->free)
|
||
|
{
|
||
|
if (UTIL_GetTeam(pPlayer) == (pBot->bot_team - 1))
|
||
|
count++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (count < max_team_players[pBot->bot_team-1])
|
||
|
break; // haven't reached limit yet, continue
|
||
|
else
|
||
|
{
|
||
|
pBot->bot_team++;
|
||
|
|
||
|
if (pBot->bot_team > max_teams)
|
||
|
pBot->bot_team = 1;
|
||
|
|
||
|
retry_count++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// select the team the bot wishes to join...
|
||
|
if (pBot->bot_team == 1)
|
||
|
strcpy(c_team, "1");
|
||
|
else if (pBot->bot_team == 2)
|
||
|
strcpy(c_team, "2");
|
||
|
else if (pBot->bot_team == 3)
|
||
|
strcpy(c_team, "3");
|
||
|
else if (pBot->bot_team == 4)
|
||
|
strcpy(c_team, "4");
|
||
|
else
|
||
|
strcpy(c_team, "5");
|
||
|
|
||
|
FakeClientCommand(pEdict, "jointeam", c_team, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_TFC_CLASS_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_TFC_IDLE; // switch back to idle
|
||
|
pBot->create_time = gpGlobals->time; // reset
|
||
|
|
||
|
if ((pBot->bot_class < 0) || (pBot->bot_class > 10))
|
||
|
pBot->bot_class = -1;
|
||
|
|
||
|
if (pBot->bot_class == -1)
|
||
|
pBot->bot_class = RANDOM_LONG(1, 10);
|
||
|
|
||
|
team = UTIL_GetTeam(pEdict);
|
||
|
|
||
|
if (team_class_limits[team] == -1) // civilian only?
|
||
|
{
|
||
|
pBot->bot_class = 0; // civilian
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (pBot->bot_class == 10)
|
||
|
class_not_allowed = team_class_limits[team] & (1<<7);
|
||
|
else if (pBot->bot_class <= 7)
|
||
|
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class-1));
|
||
|
else
|
||
|
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class));
|
||
|
|
||
|
while (class_not_allowed)
|
||
|
{
|
||
|
pBot->bot_class = RANDOM_LONG(1, 10);
|
||
|
|
||
|
if (pBot->bot_class == 10)
|
||
|
class_not_allowed = team_class_limits[team] & (1<<7);
|
||
|
else if (pBot->bot_class <= 7)
|
||
|
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class-1));
|
||
|
else
|
||
|
class_not_allowed = team_class_limits[team] & (1<<(pBot->bot_class));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// select the class the bot wishes to use...
|
||
|
if (pBot->bot_class == 0)
|
||
|
strcpy(c_class, "civilian");
|
||
|
else if (pBot->bot_class == 1)
|
||
|
strcpy(c_class, "scout");
|
||
|
else if (pBot->bot_class == 2)
|
||
|
strcpy(c_class, "sniper");
|
||
|
else if (pBot->bot_class == 3)
|
||
|
strcpy(c_class, "soldier");
|
||
|
else if (pBot->bot_class == 4)
|
||
|
strcpy(c_class, "demoman");
|
||
|
else if (pBot->bot_class == 5)
|
||
|
strcpy(c_class, "medic");
|
||
|
else if (pBot->bot_class == 6)
|
||
|
strcpy(c_class, "hwguy");
|
||
|
else if (pBot->bot_class == 7)
|
||
|
strcpy(c_class, "pyro");
|
||
|
else if (pBot->bot_class == 8)
|
||
|
strcpy(c_class, "spy");
|
||
|
else if (pBot->bot_class == 9)
|
||
|
strcpy(c_class, "engineer");
|
||
|
else
|
||
|
strcpy(c_class, "randompc");
|
||
|
|
||
|
FakeClientCommand(pEdict, c_class, NULL, NULL);
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else if (mod_id == CSTRIKE_DLL)
|
||
|
{
|
||
|
// handle Counter-Strike stuff here...
|
||
|
|
||
|
if (pBot->start_action == MSG_CS_TEAM_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_CS_IDLE; // switch back to idle
|
||
|
|
||
|
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
|
||
|
(pBot->bot_team != 5))
|
||
|
pBot->bot_team = -1;
|
||
|
|
||
|
if (pBot->bot_team == -1)
|
||
|
pBot->bot_team = RANDOM_LONG(1, 2);
|
||
|
|
||
|
// select the team the bot wishes to join...
|
||
|
if (pBot->bot_team == 1)
|
||
|
strcpy(c_team, "1");
|
||
|
else if (pBot->bot_team == 2)
|
||
|
strcpy(c_team, "2");
|
||
|
else
|
||
|
strcpy(c_team, "5");
|
||
|
|
||
|
FakeClientCommand(pEdict, "menuselect", c_team, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_CS_CT_SELECT) // counter terrorist
|
||
|
{
|
||
|
pBot->start_action = MSG_CS_IDLE; // switch back to idle
|
||
|
|
||
|
if ((pBot->bot_class < 1) || (pBot->bot_class > 4))
|
||
|
pBot->bot_class = -1; // use random if invalid
|
||
|
|
||
|
if (pBot->bot_class == -1)
|
||
|
pBot->bot_class = RANDOM_LONG(1, 4);
|
||
|
|
||
|
// select the class the bot wishes to use...
|
||
|
if (pBot->bot_class == 1)
|
||
|
strcpy(c_class, "1");
|
||
|
else if (pBot->bot_class == 2)
|
||
|
strcpy(c_class, "2");
|
||
|
else if (pBot->bot_class == 3)
|
||
|
strcpy(c_class, "3");
|
||
|
else if (pBot->bot_class == 4)
|
||
|
strcpy(c_class, "4");
|
||
|
else
|
||
|
strcpy(c_class, "5"); // random
|
||
|
|
||
|
FakeClientCommand(pEdict, "menuselect", c_class, NULL);
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_CS_T_SELECT) // terrorist select
|
||
|
{
|
||
|
pBot->start_action = MSG_CS_IDLE; // switch back to idle
|
||
|
|
||
|
if ((pBot->bot_class < 1) || (pBot->bot_class > 4))
|
||
|
pBot->bot_class = -1; // use random if invalid
|
||
|
|
||
|
if (pBot->bot_class == -1)
|
||
|
pBot->bot_class = RANDOM_LONG(1, 4);
|
||
|
|
||
|
// select the class the bot wishes to use...
|
||
|
if (pBot->bot_class == 1)
|
||
|
strcpy(c_class, "1");
|
||
|
else if (pBot->bot_class == 2)
|
||
|
strcpy(c_class, "2");
|
||
|
else if (pBot->bot_class == 3)
|
||
|
strcpy(c_class, "3");
|
||
|
else if (pBot->bot_class == 4)
|
||
|
strcpy(c_class, "4");
|
||
|
else
|
||
|
strcpy(c_class, "5"); // random
|
||
|
|
||
|
FakeClientCommand(pEdict, "menuselect", c_class, NULL);
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else if ((mod_id == GEARBOX_DLL) && (pent_info_ctfdetect != NULL))
|
||
|
{
|
||
|
// handle Opposing Force CTF stuff here...
|
||
|
|
||
|
if (pBot->start_action == MSG_OPFOR_TEAM_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_OPFOR_IDLE; // switch back to idle
|
||
|
|
||
|
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
|
||
|
(pBot->bot_team != 3))
|
||
|
pBot->bot_team = -1;
|
||
|
|
||
|
if (pBot->bot_team == -1)
|
||
|
pBot->bot_team = RANDOM_LONG(1, 2);
|
||
|
|
||
|
// select the team the bot wishes to join...
|
||
|
if (pBot->bot_team == 1)
|
||
|
strcpy(c_team, "1");
|
||
|
else if (pBot->bot_team == 2)
|
||
|
strcpy(c_team, "2");
|
||
|
else
|
||
|
strcpy(c_team, "3");
|
||
|
|
||
|
FakeClientCommand(pEdict, "jointeam", c_team, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_OPFOR_CLASS_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_OPFOR_IDLE; // switch back to idle
|
||
|
|
||
|
if ((pBot->bot_class < 0) || (pBot->bot_class > 10))
|
||
|
pBot->bot_class = -1;
|
||
|
|
||
|
if (pBot->bot_class == -1)
|
||
|
pBot->bot_class = RANDOM_LONG(1, 10);
|
||
|
|
||
|
// select the class the bot wishes to use...
|
||
|
if (pBot->bot_class == 1)
|
||
|
strcpy(c_class, "1");
|
||
|
else if (pBot->bot_class == 2)
|
||
|
strcpy(c_class, "2");
|
||
|
else if (pBot->bot_class == 3)
|
||
|
strcpy(c_class, "3");
|
||
|
else if (pBot->bot_class == 4)
|
||
|
strcpy(c_class, "4");
|
||
|
else if (pBot->bot_class == 5)
|
||
|
strcpy(c_class, "5");
|
||
|
else if (pBot->bot_class == 6)
|
||
|
strcpy(c_class, "6");
|
||
|
else
|
||
|
strcpy(c_class, "7");
|
||
|
|
||
|
FakeClientCommand(pEdict, "selectchar", c_class, NULL);
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
else if (mod_id == FRONTLINE_DLL)
|
||
|
{
|
||
|
// handle FrontLineForce stuff here...
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_TEAM_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
if ((pBot->bot_team != 1) && (pBot->bot_team != 2) &&
|
||
|
(pBot->bot_team != 5))
|
||
|
pBot->bot_team = -1;
|
||
|
|
||
|
if (pBot->bot_team == -1)
|
||
|
pBot->bot_team = RANDOM_LONG(1, 2);
|
||
|
|
||
|
// select the team the bot wishes to join...
|
||
|
if (pBot->bot_team == 1)
|
||
|
strcpy(c_team, "1");
|
||
|
else if (pBot->bot_team == 2)
|
||
|
strcpy(c_team, "2");
|
||
|
else
|
||
|
strcpy(c_team, "5");
|
||
|
|
||
|
FakeClientCommand(pEdict, "jointeam", c_team, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_CLASS_SELECT)
|
||
|
{
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
team = UTIL_GetTeam(pEdict);
|
||
|
|
||
|
if (team == 0) // rebels
|
||
|
{
|
||
|
if ((pBot->bot_class < 0) || (pBot->bot_class > 3))
|
||
|
pBot->bot_class = -1;
|
||
|
|
||
|
if (pBot->bot_class == -1)
|
||
|
pBot->bot_class = RANDOM_LONG(1, 3);
|
||
|
|
||
|
// select the class the bot wishes to use...
|
||
|
if (pBot->bot_class == 1)
|
||
|
strcpy(c_class, "rebelsrecon");
|
||
|
else if (pBot->bot_class == 2)
|
||
|
strcpy(c_class, "rebelsassault");
|
||
|
else
|
||
|
strcpy(c_class, "rebelssupport");
|
||
|
}
|
||
|
else // commandos
|
||
|
{
|
||
|
if ((pBot->bot_class < 0) || (pBot->bot_class > 3))
|
||
|
pBot->bot_class = -1;
|
||
|
|
||
|
if (pBot->bot_class == -1)
|
||
|
pBot->bot_class = RANDOM_LONG(1, 3);
|
||
|
|
||
|
// select the class the bot wishes to use...
|
||
|
if (pBot->bot_class == 1)
|
||
|
strcpy(c_class, "commandosrecon");
|
||
|
else if (pBot->bot_class == 2)
|
||
|
strcpy(c_class, "commandosassault");
|
||
|
else
|
||
|
strcpy(c_class, "commandossupport");
|
||
|
}
|
||
|
|
||
|
FakeClientCommand(pEdict, c_class, NULL, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_PISTOL_SELECT)
|
||
|
{
|
||
|
int prim_weapon_group, sec_weapon_group;
|
||
|
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
int flf_class = UTIL_GetClass(pEdict);
|
||
|
|
||
|
if (flf_class == 0) // recon
|
||
|
{
|
||
|
prim_weapon_group = RANDOM_LONG(1, 3);
|
||
|
|
||
|
if (prim_weapon_group == 1) // shotguns
|
||
|
pBot->primary_weapon = FLF_WEAPON_SPAS12;
|
||
|
else if (prim_weapon_group == 2) // submachine
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 4);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MP5A2;
|
||
|
else if (weapon == 2)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MP5SD;
|
||
|
else if (weapon == 3)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MAC10;
|
||
|
else
|
||
|
pBot->primary_weapon = FLF_WEAPON_UMP45;
|
||
|
}
|
||
|
else // rifles
|
||
|
{
|
||
|
pBot->primary_weapon = FLF_WEAPON_MSG90;
|
||
|
}
|
||
|
|
||
|
if (prim_weapon_group == 1)
|
||
|
sec_weapon_group = RANDOM_LONG(2, 3);
|
||
|
else if (prim_weapon_group == 3)
|
||
|
sec_weapon_group = RANDOM_LONG(1, 2);
|
||
|
else
|
||
|
{
|
||
|
if (RANDOM_LONG(1, 100) <= 50)
|
||
|
sec_weapon_group = 1;
|
||
|
else
|
||
|
sec_weapon_group = 3;
|
||
|
}
|
||
|
|
||
|
if (sec_weapon_group == 1) // shotguns
|
||
|
pBot->secondary_weapon = FLF_WEAPON_SPAS12;
|
||
|
else if (sec_weapon_group == 2) // submachine
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 4);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MP5A2;
|
||
|
else if (weapon == 2)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MP5SD;
|
||
|
else if (weapon == 3)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MAC10;
|
||
|
else
|
||
|
pBot->secondary_weapon = FLF_WEAPON_UMP45;
|
||
|
}
|
||
|
else // rifles
|
||
|
{
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MSG90;
|
||
|
}
|
||
|
}
|
||
|
else if (flf_class == 1) // assault
|
||
|
{
|
||
|
prim_weapon_group = RANDOM_LONG(1, 3);
|
||
|
|
||
|
if (prim_weapon_group == 1) // shotguns
|
||
|
pBot->primary_weapon = FLF_WEAPON_SPAS12;
|
||
|
else if (prim_weapon_group == 2) // submachine
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 4);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MP5A2;
|
||
|
else if (weapon == 2)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MP5SD;
|
||
|
else if (weapon == 3)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MAC10;
|
||
|
else
|
||
|
pBot->primary_weapon = FLF_WEAPON_UMP45;
|
||
|
}
|
||
|
else // rifles
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 3);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->primary_weapon = FLF_WEAPON_M4;
|
||
|
else if (weapon == 2)
|
||
|
pBot->primary_weapon = FLF_WEAPON_FAMAS;
|
||
|
else
|
||
|
pBot->primary_weapon = FLF_WEAPON_AK5;
|
||
|
}
|
||
|
|
||
|
if (prim_weapon_group == 1)
|
||
|
sec_weapon_group = RANDOM_LONG(2, 3);
|
||
|
else if (prim_weapon_group == 2)
|
||
|
{
|
||
|
if (RANDOM_LONG(1, 100) <= 50)
|
||
|
sec_weapon_group = 1;
|
||
|
else
|
||
|
sec_weapon_group = 3;
|
||
|
}
|
||
|
else // prim == 3
|
||
|
sec_weapon_group = RANDOM_LONG(1, 2);
|
||
|
|
||
|
if (sec_weapon_group == 1) // shotguns
|
||
|
pBot->secondary_weapon = FLF_WEAPON_SPAS12;
|
||
|
else if (sec_weapon_group == 2) // submachine
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 4);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MP5A2;
|
||
|
else if (weapon == 2)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MP5SD;
|
||
|
else if (weapon == 3)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MAC10;
|
||
|
else
|
||
|
pBot->secondary_weapon = FLF_WEAPON_UMP45;
|
||
|
}
|
||
|
else // rifles
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 3);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_M4;
|
||
|
else if (weapon == 2)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_FAMAS;
|
||
|
else
|
||
|
pBot->secondary_weapon = FLF_WEAPON_AK5;
|
||
|
}
|
||
|
}
|
||
|
else // support
|
||
|
{
|
||
|
prim_weapon_group = RANDOM_LONG(1, 3);
|
||
|
|
||
|
if (prim_weapon_group == 1) // shotguns
|
||
|
pBot->primary_weapon = FLF_WEAPON_SPAS12;
|
||
|
else if (prim_weapon_group == 2) // submachine
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 4);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MP5A2;
|
||
|
else if (weapon == 2)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MP5SD;
|
||
|
else if (weapon == 3)
|
||
|
pBot->primary_weapon = FLF_WEAPON_MAC10;
|
||
|
else
|
||
|
pBot->primary_weapon = FLF_WEAPON_UMP45;
|
||
|
}
|
||
|
else if (prim_weapon_group == 3) // rifles & heavyweapons
|
||
|
{
|
||
|
if (RANDOM_LONG(1, 100) <= 50)
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 3); // rifles
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->primary_weapon = FLF_WEAPON_M4;
|
||
|
else if (weapon == 2)
|
||
|
pBot->primary_weapon = FLF_WEAPON_FAMAS;
|
||
|
else
|
||
|
pBot->primary_weapon = FLF_WEAPON_AK5;
|
||
|
}
|
||
|
else // heavy weapons
|
||
|
{
|
||
|
pBot->primary_weapon = FLF_WEAPON_HK21;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (prim_weapon_group == 1)
|
||
|
sec_weapon_group = RANDOM_LONG(2, 3);
|
||
|
else if (prim_weapon_group == 2)
|
||
|
{
|
||
|
if (RANDOM_LONG(1, 100) <= 50)
|
||
|
sec_weapon_group = 1;
|
||
|
else
|
||
|
sec_weapon_group = 3;
|
||
|
}
|
||
|
else // prim == 3
|
||
|
sec_weapon_group = RANDOM_LONG(1, 2);
|
||
|
|
||
|
if (sec_weapon_group == 1) // shotguns
|
||
|
pBot->secondary_weapon = FLF_WEAPON_SPAS12;
|
||
|
else if (sec_weapon_group == 2) // submachine
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 4);
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MP5A2;
|
||
|
else if (weapon == 2)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MP5SD;
|
||
|
else if (weapon == 3)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_MAC10;
|
||
|
else
|
||
|
pBot->secondary_weapon = FLF_WEAPON_UMP45;
|
||
|
}
|
||
|
else if (sec_weapon_group == 3) // rifles & heavyweapons
|
||
|
{
|
||
|
if (RANDOM_LONG(1, 100) <= 50)
|
||
|
{
|
||
|
int weapon = RANDOM_LONG(1, 3); // rifles
|
||
|
|
||
|
if (weapon == 1)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_M4;
|
||
|
else if (weapon == 2)
|
||
|
pBot->secondary_weapon = FLF_WEAPON_FAMAS;
|
||
|
else
|
||
|
pBot->secondary_weapon = FLF_WEAPON_AK5;
|
||
|
}
|
||
|
else // heavy weapons
|
||
|
{
|
||
|
pBot->secondary_weapon = FLF_WEAPON_HK21;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int pistol = RANDOM_LONG(1, 2);
|
||
|
|
||
|
if (pistol == 1)
|
||
|
strcpy(c_item, "26"); // mk23
|
||
|
else
|
||
|
strcpy(c_item, "23"); // beretta
|
||
|
|
||
|
FakeClientCommand(pEdict, "pistols", c_item, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_WEAPON_SELECT)
|
||
|
{
|
||
|
int weapon_class;
|
||
|
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
if (pBot->primary_weapon)
|
||
|
weapon_class = pBot->primary_weapon;
|
||
|
else
|
||
|
weapon_class = pBot->secondary_weapon;
|
||
|
|
||
|
if (weapon_class == FLF_WEAPON_SPAS12) // shotguns
|
||
|
strcpy(c_item, "shotgun");
|
||
|
else if ((weapon_class == FLF_WEAPON_MP5A2) || // submachine
|
||
|
(weapon_class == FLF_WEAPON_MP5SD) ||
|
||
|
(weapon_class == FLF_WEAPON_MAC10) ||
|
||
|
(weapon_class == FLF_WEAPON_UMP45))
|
||
|
strcpy(c_item, "submachine");
|
||
|
else if ((weapon_class == FLF_WEAPON_M4) ||
|
||
|
(weapon_class == FLF_WEAPON_FAMAS) ||
|
||
|
(weapon_class == FLF_WEAPON_AK5) ||
|
||
|
(weapon_class == FLF_WEAPON_MSG90))
|
||
|
strcpy(c_item, "rifles");
|
||
|
else
|
||
|
strcpy(c_item, "heavyweapons");
|
||
|
|
||
|
FakeClientCommand(pEdict, "wpnclass", c_item, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_SHOTGUN_SELECT)
|
||
|
{
|
||
|
int weapon_class;
|
||
|
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
if (pBot->primary_weapon)
|
||
|
{
|
||
|
weapon_class = pBot->primary_weapon;
|
||
|
pBot->primary_weapon = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
weapon_class = pBot->secondary_weapon;
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
}
|
||
|
|
||
|
sprintf(c_item, "%d", weapon_class);
|
||
|
|
||
|
FakeClientCommand(pEdict, "shotgun", c_item, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_SUBMACHINE_SELECT)
|
||
|
{
|
||
|
int weapon_class;
|
||
|
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
if (pBot->primary_weapon)
|
||
|
{
|
||
|
weapon_class = pBot->primary_weapon;
|
||
|
pBot->primary_weapon = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
weapon_class = pBot->secondary_weapon;
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
}
|
||
|
|
||
|
sprintf(c_item, "%d", weapon_class);
|
||
|
|
||
|
FakeClientCommand(pEdict, "submach", c_item, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_RIFLE_SELECT)
|
||
|
{
|
||
|
int weapon_class;
|
||
|
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
if (pBot->primary_weapon)
|
||
|
{
|
||
|
weapon_class = pBot->primary_weapon;
|
||
|
pBot->primary_weapon = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
weapon_class = pBot->secondary_weapon;
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
}
|
||
|
|
||
|
sprintf(c_item, "%d", weapon_class);
|
||
|
|
||
|
FakeClientCommand(pEdict, "rifles", c_item, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pBot->start_action == MSG_FLF_HEAVYWEAPONS_SELECT)
|
||
|
{
|
||
|
int weapon_class;
|
||
|
|
||
|
pBot->start_action = MSG_FLF_IDLE; // switch back to idle
|
||
|
|
||
|
if (pBot->primary_weapon)
|
||
|
{
|
||
|
weapon_class = pBot->primary_weapon;
|
||
|
pBot->primary_weapon = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
weapon_class = pBot->secondary_weapon;
|
||
|
|
||
|
// bot has now joined the game (doesn't need to be started)
|
||
|
pBot->not_started = 0;
|
||
|
}
|
||
|
|
||
|
sprintf(c_item, "%d", weapon_class);
|
||
|
|
||
|
FakeClientCommand(pEdict, "heavyweapons", c_item, NULL);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else if (mod_id == AVH_DLL)
|
||
|
{
|
||
|
// if(pBot->mBotPlayMode == PLAYMODE_READYROOM)
|
||
|
// {
|
||
|
// // Look at desired team and head to nearest start entity
|
||
|
// AvHClassType theClassType = AVH_CLASS_TYPE_UNDEFINED;
|
||
|
//// if(pBot->mBotRole == ROLE_UNDEFINED)
|
||
|
//// {
|
||
|
//// // Choose a random team
|
||
|
//// theClassType = AvHClassType(RANDOM_LONG(1, 2));
|
||
|
//// }
|
||
|
//// else
|
||
|
//// {
|
||
|
//// theClassType = (AvHClassType)pBot->mBotRole;
|
||
|
//// }
|
||
|
////
|
||
|
//// // Now navigate to the nearest start entity
|
||
|
//// if(theClassType == AVH_CLASS_TYPE_MARINE)
|
||
|
//// {
|
||
|
// FakeClientCommand(pEdict, kcAutoAssign, c_item, NULL);
|
||
|
// //FakeClientCommand(pEdict, kcJoinTeamOne, c_item, NULL);
|
||
|
//
|
||
|
// // Try to become a squad leader if possible
|
||
|
//// pBot->pEdict->v.impulse = RANK_PROMOTE;
|
||
|
//// }
|
||
|
//// else if(theClassType == AVH_CLASS_TYPE_ALIEN)
|
||
|
//// {
|
||
|
//// FakeClientCommand(pEdict, kcJoinTeamTwo, c_item, NULL);
|
||
|
//// }
|
||
|
//
|
||
|
// // bot has now joined the game (doesn't need to be started)
|
||
|
// pBot->not_started = 0;
|
||
|
// }
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// otherwise, don't need to do anything to start game...
|
||
|
pBot->not_started = 0;
|
||
|
}
|
||
|
}
|
||
|
|