Resolve old bot's connection state issues (#917)

* final bot's fixes

Fixes: #916
Fixes: #883
Fixes: #875

* suggestions

* suggestions

Co-authored-by: shel <2@shelru.ru>
This commit is contained in:
shel
2021-03-09 16:10:59 -06:00
committed by GitHub
parent 8c6b0f84bb
commit bee4b47b07
3 changed files with 56 additions and 8 deletions

View File

@ -799,6 +799,26 @@ static cell AMX_NATIVE_CALL is_user_connected(AMX *amx, cell *params) /* 1 param
CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
if(pPlayer->IsBot())
{
// For legacy bot's
// which are using is_user_connected
// to check out is bot connected to server
return (pPlayer->initialized ? 1 : 0);
}
return (pPlayer->ingame ? 1 : 0);
}
static cell AMX_NATIVE_CALL is_user_connected_ex(AMX *amx, cell *params) /* 1 param */
{
int index = params[1];
if (index < 1 || index > gpGlobals->maxClients)
return 0;
CPlayer* pPlayer = GET_PLAYER_POINTER_I(index);
return (pPlayer->ingame ? 1 : 0);
}
@ -4776,6 +4796,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"is_user_authorized", is_user_authorized},
{"is_user_bot", is_user_bot},
{"is_user_connected", is_user_connected},
{"is_user_connected_ex", is_user_connected_ex},
{"is_user_connecting", is_user_connecting},
{"is_user_hltv", is_user_hltv},
{"lang_exists", lang_exists},
@ -4796,7 +4817,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
{"plugin_flags", plugin_flags},
{"precache_model", precache_model},
{"precache_sound", precache_sound},
{"precache_generic", precache_generic},
{"precache_generic", precache_generic},
{"precache_event", precache_event},
{"random_float", random_float},
{"random_num", random_num},

View File

@ -1020,8 +1020,20 @@ void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer)
// Emulate bot connection and putinserver
if (pPlayer->ingame)
{
pPlayer->name =name; // Make sure player have name up to date
} else if (pEntity && pEntity->pvPrivateData && pPlayer->IsBot()) {
pPlayer->name=name; // Make sure player have name up to date
}
else
if(infobuffer /* just for safety */
&& pEntity
&& pEntity->pvPrivateData /* have a private data (same as player) */
&& pPlayer->initialized /* needless check due strstr, but we should confirm that there's no putinserver before client_connect */
&& pPlayer->IsBot() && strstr(infobuffer, "\\*bot\\1")) {
pPlayer->PutInServer();
++g_players_num;
executeForwards(FF_ClientPutInServer, static_cast<cell>(pPlayer->index));
}
else if (pEntity && pPlayer->IsBot()) {
pPlayer->Connect(name, "127.0.0.1"/*CVAR_GET_STRING("net_address")*/);
executeForwards(FF_ClientConnect, static_cast<cell>(pPlayer->index));
@ -1039,11 +1051,6 @@ void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer)
}
}
executeForwards(FF_ClientAuthorized, static_cast<cell>(pPlayer->index), authid);
pPlayer->PutInServer();
++g_players_num;
executeForwards(FF_ClientPutInServer, static_cast<cell>(pPlayer->index));
}
RETURN_META(MRES_IGNORED);