Описание:
Получает у игрока хеш от данных аккаунта пользователя Windows.
Параметры:
playerid - ID игрока.
buffer[] - переменная (массив), в которой будет записан хеш. Рекомендуемый размер: 40+1 (длина хеша + символ завершения строки),
size - размер массива buffer (необязательный параметр, если объявить функцию вручную с "size = sizeof(buffer)").
Возвращаемое значение:
Если указанный игрок подключен, функция возвращает длину хеша (сам хеш возвращается через массив buffer), иначе возвращает 0.
Примечания:
- Функция существует, начиная с SA:MP 0.3b R1. Основным назначением функции в то время была блокировка читеров.
Тем не менее, не рекомендуется использовать функцию для идентификации игроков (например, при бане игрока).
Хеш вычисляется из данных аккаунта пользователя в Windows.
Эти данные могут совпадать у разных игроков, поэтому хеш не уникален для каждого игрока.
Есть вероятость, что если забанить игрока по gpci, то вместе с ним окажутся забанены ещё несколько игроков с таким же хешем (примерно 5-10%, со слов куя).
Допускается банить игроков по gpci только в самых крайних случаях (например, если читер терроризирует сервер, не давая никому спокойно играть, и обычный бан по IP не помогает, т.к. читер легко может сменить IP, всего лишь перезагрузив роутер), но ни в коем случае не для бана рядовых игроков.
- Функция не объявлена в инклудах SA:MP, но присутствует в коде сервера, поэтому следует объявлять её вручную.
PHP код:
#if !defined gpci // не помешает сначала проверить, вдруг эта функция уже была где-то объявлена
native gpci(playerid, buffer[], size = sizeof(buffer));
#endif
Функция не задокументирована на SA:MP wiki, т.к. раскрытие принципа её работы может помочь читерам для обхода бана.
Но кого-нибудь это когда-то останавливало? Бан по gpci давно научились обходить: нужно сменить аккаунт пользователя в Windows, либо создать новый аккаунт, если он у вас только один. Соль лишь в том, что для читеров эти усилия того не стоят - уже не получится после каждого бана сволочно реконнектиться через пару секунд с новым IP. Правда, в теории есть возможность подделать данные для gpci, покопавшись в памяти клиента.
- Также, если вам непривычно название функции в виде аббревиатуры строчными буквами, можно объявить функцию с другим названием в том же стиле, в котором названы все остальные функции SA:MP:
PHP код:
#if !defined GetPlayerClientID
native GetPlayerClientID(playerid, buffer[], size = sizeof(buffer)) = gpci;
#endif
- Комментарий самого куя по поводу gpci: http://pastebin.com/VQSGpbSm
Пример использования:
#if !defined GetPlayerClientID
native GetPlayerClientID
(playerid
, buffer
[], size
= sizeof(buffer
)) = gpci; #endif
{
new buffer[40+1];
GetPlayerClientID(playerid, buffer);
}
См. также:
Статью подготовил: Daniel_Cortez
Копирование данной статьи на других порталах без разрешения автора запрещено!