Лол, в панели нету страничек???Palonez, проверяй
дать ссылку где можно найти исходник или прикрепить его к сообщениюСпамит в консоли беспредельно, что мне с этим делать?
char g_iAuth[MAXPLAYERS + 1][32];
GetClientAuthId(iClient, AuthId_Steam2, g_iAuth[iClient], 32);
if(Мега проверка)
{
LogToFile(ERR, "Словили пустой iAuth");
return;
}
// Выполняем код[B]э[/B]
char szQuery[1024]; и т.д
LogToFile(LOG, "%s quit, iTime: %i", g_iAuth[iClient], g_iGame);
Приветствую.
Суть проблемы:
Иногда бывает когда игрок присоединится к серверу вызывается функция OnClientDisconnect() и когда выходит опять же вызывается она. Так вот при первом вызове в g_iAuth[iClient] приходит пустое значение.
Подскажите как сделать проверку: Если g_iAuth[iClient] == null то return;
Верху плагина
C-подобный:char g_iAuth[MAXPLAYERS + 1][32]; GetClientAuthId(iClient, AuthId_Steam2, g_iAuth[iClient], 32);
OnClientDisconnect()
C-подобный:if(Мега проверка) { LogToFile(ERR, "Словили пустой iAuth"); return; } // Выполняем код[B]э[/B] char szQuery[1024]; и т.д LogToFile(LOG, "%s quit, iTime: %i", g_iAuth[iClient], g_iGame);
if( !g_iAuth[client][0] ) return;
// Проверяем заполнена ли ячейка в строке [0]
// Если в ней есть что-то, то возвратит true, если нет то false
// Выше указано, что если стока не пустая (конкретно первый символ, пробел это тоже считается как символ), то return
Приветствую.
Суть проблемы:
Иногда бывает когда игрок присоединится к серверу вызывается функция OnClientDisconnect() и когда выходит опять же вызывается она. Так вот при первом вызове в g_iAuth[iClient] приходит пустое значение.
Подскажите как сделать проверку: Если g_iAuth[iClient] == null то return;
Верху плагина
C-подобный:char g_iAuth[MAXPLAYERS + 1][32]; GetClientAuthId(iClient, AuthId_Steam2, g_iAuth[iClient], 32);
OnClientDisconnect()
C-подобный:if(Мега проверка) { LogToFile(ERR, "Словили пустой iAuth"); return; } // Выполняем код[B]э[/B] char szQuery[1024]; и т.д LogToFile(LOG, "%s quit, iTime: %i", g_iAuth[iClient], g_iGame);
g_iAuth[iClient] == 0
C++:if( !g_iAuth[client][0] ) return; // Проверяем заполнена ли ячейка в строке [0] // Если в ней есть что-то, то возвратит true, если нет то false // Выше указано, что если стока не пустая (конкретно первый символ, пробел это тоже считается как символ), то return
L 10/01/2019 - 20:59:11: [StatsPlayers.smx] Словили пустой iAuth
L 10/01/2019 - 20:59:22: [StatsPlayers.smx] STEAM_1:1:451171923 quit, iTime: 8
пару фиксов
SetPanelCurrentKey(panel, 10);
iMax = SQL_GetRowCount(hndl);
? Нужно было добавить отдельную переменную для квара, а эта у меня используется для того, чтобы не было пустых строк в меню, если игроков в списке меньше, чем 100.public GetTop100(Handle:owner, Handle:hndl, const String:error[], any:serial)
{
...
iPos[client] = 1; // сразу отправляем на вторую страницу?
...
}
public FunctionDisplay(client, String:buffer[], maxlength)
{
char buff[30];
Format(buff, sizeof(buff), "ТОП%i богачей", iMax);
strcopy(buffer, maxlength, buff);
}
public FunctionDisplay(client, String:buffer[], maxlength)
{
FormatEx(buffer, 30, "ТОП%i богачей", iMax);
}
if(iMax > 500) iMax = 500;
(cvar = CreateConVar("sm_shop_top_max", "41", _, _, true, _, true, 500.0)).AddChangeHook(ChangeCvar_Max);
Наш человек читает мануал, только в одном случае?Подскажите как сделать проверку: Если g_iAuth[iClient] == null то return;
вот этого по идее должно быть достаточноReturn Value
True on success, false otherwise.
if(!g_iAuth[iClient][0]) return;
А при срабатывании какого события ты пытаешься получить SteamId?Я так понял после перезагрузки плагина, и если я зайду то g_iAuth будет null у меня
DHooks самой свежей версии?Как-то можно это пофиксить?
А при срабатывании какого события ты пытаешься получить SteamId?
public void OnClientPostAdminCheck(int iClient)
{
if (!IsFakeClient(iClient))
{
char szQuery[256], szAuth[32];
GetClientAuthId(iClient, AuthId_Engine, szAuth, sizeof(szAuth), true);
FormatEx(szQuery, sizeof(szQuery), "Мега запрос", szAuth);
g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient));
}
}
public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet hResults, const char[] sError, any iUserID)
{
if (sError[0])
{
LogError("SQL_Callback_SelectClient: %s", sError);
return;
}
int iClient = GetClientOfUserId(iUserID);
if (iClient)
{
char szQuery[1024], szName[MAX_NAME_LENGTH * 2 + 1], sClientIP[PLATFORM_MAX_PATH];
g_hDatabase.Escape(szQuery, szName, sizeof(szName));
GetClientName(iClient, szQuery, MAX_NAME_LENGTH);
GetClientIP(iClient, sClientIP, sizeof(sClientIP));
GetClientAuthId(iClient, AuthId_Steam2, g_iAuth[iClient], 32);
ниже код пошёл на обновления данных игрока в [B]MySQL[/B] либо добавление.
а для чего ты получаешь SteamId 2 раза?
да ещё и разных типов
у тебя же должен всегда использоваться только 1, т.к. и работа ведётся только с одной БД
получи один раз и храни пока игрок на сервере
при работе с БД используй сохранённый SteamId
public void OnClientPostAdminCheck(int iClient) {
if (!IsFakeClient(iClient)) {
char szQuery[256];
GetClientAuthId(iClient, AuthId_Steam2, g_iAuth[iClient], 32, true);
FormatEx(szQuery, sizeof(szQuery), "Мега запрос", g_iAuth[iClient]);
g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient));
}
}
Вот как-то так:Called when a client receives an auth ID. The state of a client's authorization as an admin is not guaranteed here. Use OnClientPostAdminCheck() if you need a client's admin status.
This is called by bots, but the ID will be "BOT".
char sSId[MAXPLAYERS+1][24];
public void OnClientAuthorized(int client, const char[] auth)
{
sSId[client][0] = 0;
if(!IsFakeClient(client))
{
char szQuery[256];
FormatEx(sSId[client], sizeof(sSId[client][]), auth);
FormatEx(szQuery, sizeof(szQuery), "Мега запрос", auth);
g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(client));
}
}
public void SQL_Callback_SelectClient(Database hDatabase, DBResultSet hResults, const char[] sError, any client)
{
if(sError[0])
{
LogError("SQL_Callback_SelectClient: %s", sError);
return;
}
if((client = GetClientOfUserId(client)))
{
char szQuery[1024],
// ну как бы для чего нам строка длиннее максимальной длины имени?
// Да и размер символьного массива округляется компилятором в большую сторону до числа кратного 4 или 8, не помню точно
szName[MAX_NAME_LENGTH],
// IP длиннее 15 символов это IP с портом, да и то это 21 символ всего, а не 256, как ты прописал
IP[16];
g_hDatabase.Escape(szQuery, szName, sizeof(szName)); // а где берётся значение szQuery?
GetClientName(client, szQuery, sizeof(szQuery));
GetClientIP(client, IP, sizeof(IP));
// а дальше используем сохранённый sSId[client]
Совет, вместо FormatEx лучше использовать Database.Format(). Database.Format · dbi · SourceMod Scripting API ReferenceСпасибо за совет, исправил.
C-подобный:public void OnClientPostAdminCheck(int iClient) { if (!IsFakeClient(iClient)) { char szQuery[256]; GetClientAuthId(iClient, AuthId_Steam2, g_iAuth[iClient], 32, true); FormatEx(szQuery, sizeof(szQuery), "Мега запрос", g_iAuth[iClient]); g_hDatabase.Query(SQL_Callback_SelectClient, szQuery, GetClientUserId(iClient)); } }
а почему ты сделал так:Почему команда дублируется от лица игрока несколько раз?
public void FRS_Overload()
{
OnPluginStart();
}
Что бы при загрузке ядра, все его модули отослали данные игроков. А почему они в OnPluginsStart(), это из-за того, что бы модуль можно было подгрузить посреди карты и не было с ним траблова почему ты сделал так:?C-подобный:public void FRS_Overload() { OnPluginStart(); }