Не распознает STEAMID или другая причина. Телепатия

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Возникла проблема:-D
Приспичило немного переписать плагин сохранения статистики в бд, да вот проблема возникла.

Имеется такой код:
PHP:
public OnClientPostAdminCheck(client)
{
	decl String:sAuth[32];
	GetClientAuthString(client, sAuth, sizeof(sAuth) - 1);
	decl String:sQuery[256];
	Format(sQuery, sizeof(sQuery) - 1, "SELECT * FROM dp_users WHERE Steam = '%s'", sAuth);
	SQL_TQuery(db, SQL_SelectPlayerCallback, sQuery, client);
}


public SQL_SelectPlayerCallback(Handle:owner, Handle:hndl, const String:error[], any:iClient)
{
	if(hndl == INVALID_HANDLE)
	{
		LogError("Ошибка подключения к базе данных (%s)", error);
	}
	else
	{
		if(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl) && IsClientInGame(iClient))
		{
			Player[pKills][iClient] = SQL_FetchInt(hndl, 2);
			Player[pDeaths][iClient] = SQL_FetchInt(hndl, 3);
			Player[pLevel][iClient] = SQL_FetchInt(hndl, 4);
			Player[pEXP][iClient] = SQL_FetchInt(hndl, 5);
			Player[pCredit][iClient] = SQL_FetchInt(hndl, 6);
			Player[pBanValue][iClient] = SQL_FetchInt(hndl, 7);
		}
		else
		{
			Player[pKills][iClient] = 0;
			Player[pDeaths][iClient] = 0;
			Player[pLevel][iClient] = 0;
			Player[pEXP][iClient] = 0;
			Player[pCredit][iClient] = 0;
			Player[pBanValue][iClient] = 0;
		}
	}
}

public OnClientDisconnect(client) 
{ 
	if(0 < client <= MaxClients && !IsFakeClient(client)) 
	{ 
		Player[PlayerJoin][client] = 1;
		decl String:sAuth[64], String:pName[150], String:query[2048]; 
		GetClientName(client, sAuth, sizeof(sAuth) - 1); 
		SQL_EscapeString(db, sAuth, pName, sizeof(pName) - 1); 
		GetClientAuthString(client, sAuth, sizeof(sAuth) - 1); 
		FormatEx(query, sizeof(query), 
		"INSERT INTO dp_users (Steam, Nick, Kills, Deaths, Level, EXP, Credits, BanValue) VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d) ON DUPLICATE KEY UPDATE Steam = '%s', Nick = '%s', Kills = %d, Deaths = %d, Level = %d, EXP = %d, Credits = %d, BanValue = %d",
		sAuth,
		pName,
		Player[pKills][client],
		Player[pDeaths][client],
		Player[pLevel][client],
		Player[pEXP][client],
		Player[pCredit][client],
		Player[pBanValue][client],
		sAuth,
		pName,
		Player[pKills][client],
		Player[pDeaths][client],
		Player[pLevel][client],
		Player[pEXP][client],
		Player[pCredit][client],
		Player[pBanValue][client]); 
		SQL_TQuery(db, SQL_SelectPlayerCallback, query); 
	} 
}

Суть проблемы в том, что в базу в поле Steam записывается ник игрока, а не его STEAMID. Происходит это редко, но это очень мешает. Как, когда и по какой причине это происходит - я не имею понятия.
Один из вариантов, это при подключении к серверу игрока кикает, но, разве, steamid не известен уже в тот момент?
 

Вложения

  • steamid.jpg
    steamid.jpg
    16.1 КБ · Просмотры: 22

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
AlmazON, я имею ввиду:
Игрок подключается, и во время подключения сразу отключается, следовательно должна срабатывать функция OnClientDisconnect, а в ней идёт запись данных в бд. В итоге задаётся вопрос: "Доступен ли steamid игрока в такой ситуации(моменте)?"

Игра CSGO :)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
должна срабатывать функция OnClientDisconnect
А ты попробуй, если есть сомнения. Тем более, на CS:GO. Что мешает сделать тест?
if(0 < client <= MaxClients && !IsFakeClient(client))
client может быть только 0, но не выше MaxClients. Лишняя проверка.
Оффтоп
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
AlmazON, что раньше вызывается?
OnClientPostAdminCheck или player_connect?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Цепочка вызовов при подключении игрока к серверу:
1) HookEvent("player_connect", callback, EventHookMode_Pre);
2) public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
3) OnClientConnected(client)
4) OnClientAuthorized(client, const String:auth[])
5) OnClientPutInServer(client)
6) public Action:OnClientPreAdminCheck(client)
7) OnClientPostAdminFilter(client)
8) OnClientPostAdminCheck(client)
Самый первый.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Проблема в силе. Игроки стали жаловаться, что теперь вообще всё обнуляется...
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
Primo, в новом см перешли на новый тип стима. Может в ксго старый просто убрали?
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
R1KO, не убрали, и не собираются убирать, похоже. Ну, по крайней мере, уже месяца 3 собираются.

Через networkid не вариант. Не берёт steamid.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
В общем, причиной, как и предполагалось, является отключение во время подключения.
Сейчас забанил игрока, и когда он подключался его кикнуло из-за бана. В бд записалось вместо steamid его ник. Кто знает решения?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
В бд записалось вместо steamid его ник. Кто знает решения?
Для записи самого ника используй %N, как форматирование индекса игрока client.
Сделай тест, до какого уровня проверок (которые я 8 штук написал) может дойти забаненный игрок и на этом уровне, если он удобен, и сделай получение данных.
Я бы на твоем месте пробовал, начиная с OnClientAuthorized(client, const String:auth[]) (и выше по списку) - очень удобно.
 

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
OnClientConnected(client) тут писало ошибку, что индекс клиента 0, и его steamid не получался, как и с player_connect. (ну старый формат steamid)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Primo

типа серьёзный тип
Сообщения
1,532
Реакции
759
Возникла идея.
Какой порядок вызова функций при отключении?
И можно ли проверить, был ли игрок в игре до того(подключился ли), когда выходит?
Если да, то как?
Просто получается так, что ни 1 событие не получает данные игрока раньше срабатывания функции OnClientDisconnect, т.к. игрок, который в бане, пытается подключится, а его сразу же кикает.

Добавлено через 1 час 31 минуту
Проблему решил путём создания дополнительной переменной. Спасибо AlmazON и R1KO за помощь.
 
Последнее редактирование:
Сверху Снизу