From bee4b47b0767abf9e5643263de0cf5a239ee3dc7 Mon Sep 17 00:00:00 2001 From: shel <9306996+afwn90cj93201nixr2e1re@users.noreply.github.com> Date: Tue, 9 Mar 2021 16:10:59 -0600 Subject: [PATCH] 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> --- amxmodx/amxmodx.cpp | 23 ++++++++++++++++++++++- amxmodx/meta_api.cpp | 21 ++++++++++++++------- plugins/include/amxmodx.inc | 20 ++++++++++++++++++++ 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 55914ec1..0eaa3b94 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -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}, diff --git a/amxmodx/meta_api.cpp b/amxmodx/meta_api.cpp index 1f2ff507..9002bca7 100755 --- a/amxmodx/meta_api.cpp +++ b/amxmodx/meta_api.cpp @@ -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(pPlayer->index)); + } + else if (pEntity && pPlayer->IsBot()) { pPlayer->Connect(name, "127.0.0.1"/*CVAR_GET_STRING("net_address")*/); executeForwards(FF_ClientConnect, static_cast(pPlayer->index)); @@ -1039,11 +1051,6 @@ void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer) } } executeForwards(FF_ClientAuthorized, static_cast(pPlayer->index), authid); - - pPlayer->PutInServer(); - ++g_players_num; - - executeForwards(FF_ClientPutInServer, static_cast(pPlayer->index)); } RETURN_META(MRES_IGNORED); diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index ed1f3ec5..16572616 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -943,12 +943,32 @@ native is_user_authorized(index); * 1 to MaxClients range. That means you can safely use this native * without manually verifying that the index is a valid client index. * + * @note Due back-compatibility return's true after bot proceed client_connect + * stage (when bot's pdata isn't created yet). + * + * @note Use is_user_connected_ex to check player against real connection state + * * @param index Client index * * @return 1 if client is connected, 0 otherwise + * always returns 1 if bot passed client_connect stage */ native is_user_connected(index); +/** + * + * Returns if the client is fully connected (proceed client_putinserver state). + * + * @note This does not throw an error if the provided index is out of the + * 1 to MaxClients range. That means you can safely use this native + * without manually verifying that the index is a valid client index. + * + * @param index Client index + * + * @return 1 if bot is connected, 0 otherwise + */ +native is_user_connected_ex(const index); + /** * Returns if the client is connecting. *