28.03.24
15:09
Работа с модулем GeoIP
Работа с модулем GeoIP

Работа с модулем GeoIP

GeoIP - модуль AmxModX позволяющий определить ~ местоположение игрока, рассчитать расстояние от одного пункта до другого.
В данном уроки мы будем работать с библиотекой GeoIP и несколькими нативами:
native geoip_country(const ip[], result[], len = 45); ( Признана устаревшей с версии 1.8.3, является аналогом geoip_country_ex )
native geoip_country_ex(const ip[], result[], len, id = -1);
native geoip_city(const ip[], result[], len, id = -1);
native geoip_region_name(const ip[], result[], len, id = -1);
native Float:geoip_latitude(const ip[]);
native Float:geoip_longitude(const ip[]);

Для определения региона и страны необходимо скачать доп. базу данных - Доступно только для пользователейклацк ( Качать City, первый столбец )
Ну а теперь собственно первый пример:
Доступно только для пользователейpublic client_putinserver(id)
{

// native geoip_country(const ip[], result[], len = 45);

// В аргументах видим 3 значения

// Также есть native geoip_country_ex(const ip[], result[], len, id = -1); ( Добавлен в версии 1.8.3-dev либо 1.9.0 , точно не помню )

// В нём имеется 4 аргумента

// 1-ым аргументом мы должны указать ip-адрес игрока

// во 2-ой аргумент будет происходить запись результата

// 3-им результатом мы должны указать размер

public OnShowInfo(id) // Создадим простейшую функцию ( В аргументах передаём индекс игрока )

{

new szCountry[35]; // В данную переменную мы запишем страну

new szIp[23]; // В данную переменную мы запишем ip игрока, для последующего использования в функции geoip_country_ex

get_user_ip(id, szIp, charsmax(szIp),1); // с помощью данной функции мы получим ip и запишем его в переменную, 4-ым аргументом является тип который нам нужен ( 0 - с клиент-портом, 1 - лишь ip , подробнее [URL='https://www.amxmodx.org/api/amxmodx/get_user_ip']тык[/URL] )

if(geoip_country_ex(szIp, szCountry, charsmax(szCountry)) == 0) // создадим вызов и вместе с ним проверку ( Если город не найден, то вернет значение равное 0 , данная проверка актуальна для AmxModX >= 1.8.3 )
{

formatex(szCountry, charsmax(szCountry), "Неопределён"); // Сюда мы запишем страну, если она не определена.
client_print_color(id, 0, "Ваша страна - ^4%s", szCountry); // Выведем её, если у вас версия ранее 1.8.3 , то используйте свой колор-чат
}

}

}

Пример получения города и региона:
Доступно только для пользователей// Закиньте БД с городами в /data/, после этого необходима ПЕРЕЗАГРУЗКА сервера, а не рестарт.

public OnShowInfo(id)
{

new szIp[23], new szRegion[32], new szCity[64];

get_user_ip(id, szIp, charsmax(szIp),1);

if(geoip_city(szIp, szCity, charsmax(szCity)) == 0)
{

formatex(szCity, charsmax(szCity), "Неизвестно");

}

if(geoip_region_name(szIp, szRegion, charsmax(szRegion)) == 0)
{

formatex(szRegion, charsmax(szRegion), "Неизвестно");

}

client_print_color(id, 0, "^1[^4GeoIP^1] [ ^4%s ^1| ^4%s^1 ]", szRegion, szCity);

}

Пример получения расстояния:
Доступно только для пользователейpublic OnShowDistance(id, pid) // В аргументах функции передаём id игрока который открыл меню и который был выбран в меню
{

new szIpo[23], szIpt[23] // Создаём переменные для хранения IP

new szName[35]; // создадим переменную для хранении ника второго игрока

get_user_name(pid, szName, charsmax(szName))

get_user_ip(id, szIpo, charsmax(szIpo), 1) // получаем айпи первого игрока
get_user_ip(pid, szIpt, charsmax(szIpt), 1) // получаем айпи второго игрока

new Float:szLato = geoip_latitude(szIpo) // получаем широту города первого игрока
new Float:szLono = geoip_longitude(szIpo) // Получаем долготу города второго игрока
// Получаем широту, долготу города 2-ого игрока
new Float:szLatt = geoip_latitude(szIpt)
new Float:szLont = geoip_longitude(szIpt)

new Float:szDistance = geoip_distance(szLato, szLono, szLatt, szLont, SYSTEM_METRIC); // создадим переменную в которой будет храниться дистанция и запишем в неё эту дистанцию

client_print_color(id, 0, "Расстояние до игрока %s составляет %.2f", szName, szDistance)

}

Влад Минаев написал 2018-09-12 16:21:59
up