Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

3 страниц V   1 2 3

amx_ips под русские ники

, нужно адаптировать плагин под русские ники
strikerman
сообщение 16.3.2015, 18:58
Сообщение #21
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

БЕРУ СВОИ СЛОВА НАЗАД.
Я рано обрадовался. Изменение
Код:
get_user_name(players[i], name, sizeof(name)-1) на get_user_rusname(players[i], name, sizeof(name)-1).

не помогает!!!

Я написал в стиме русский ник и зашёл и вроде не выкинуло. Но потом когда на сервере уже были игроки - то я зашёл
написал amx_ips и сервер тут-же упал, перезапустил сервер ещё раз, проверил - опять упал.

Пожалуйста нужно другое решение.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 16.3.2015, 19:15
Сообщение #22
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Цитата(strikerman @ 16.3.2015, 20:58) *
БЕРУ СВОИ СЛОВА НАЗАД.
Я рано обрадовался. Изменение
Код:
get_user_name(players[i], name, sizeof(name)-1) на get_user_rusname(players[i], name, sizeof(name)-1).

не помогает!!!

Я написал в стиме русский ник и зашёл и вроде не выкинуло. Но потом когда на сервере уже были игроки - то я зашёл
написал amx_ips и сервер тут-же упал, перезапустил сервер ещё раз, проверил - опять упал.

Пожалуйста нужно другое решение.


Для get_user_rusname нужен вот этот плагин
Скрытый текст
http://www.amx-x.ru/viewtopic.php?f=12&t=269&p=53922

В plugins.ini он должен быть раньше твоего IPTools.
Потом добавь в свой IPTools в начале плагина native get_user_rusname(index, name[], len), до использования get_user_rusname.

get_user_info стандартная функция, для неё ничего делать не надо.

Кинь то что у тебя получилось.

Отредактировал: Valer4, - 16.3.2015, 19:17
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
strikerman
сообщение 16.3.2015, 21:12
Сообщение #23
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Погоди, я понял что сторонним плагином можно проблему обойти, но всё таки хочу проблему не обойти, а решить.
Не установкой дополнительного плагина, а фиксом глюков в имеющемся.

Я опять попытался проэкспериментировать.
Нописал русскими буквами ник из 2- букв, много раз крашил сервер,
но 1 раз сервер не упал и в таблице я увидел что 2 буквы превратились в 4 кракозябли.
Тоесть каждый символ имени передаётся 2 байтами - это 100% кодировка юникод.

А падает я думаю из-за того что 4 байта имени не имеют аналогичных ANSI символов.
Надо как-то заставить любой юникод-символ превращать в существующий ANSI-символ.

В плагине есть функция, которая корректирует полученное имя
for(i = 0; i < inum; i++) {
get_user_name(players[i], name, sizeof(name)-1)
if(contain(name, "<") >= 0)
replace(name, sizeof(name)-1, "<", "&lt;")
if(contain(name, ">") >= 0)
replace(name, sizeof(name)-1, ">", "&gt;");


Нужно заставить полученные юникод байты в диапазоне 0х00 ... 0xFF преобразовать
в ANSI кодировку, то есть перенести в диапазон значений от 0x30 (код цифры 0) до 0x7A (код буквы z).
То есть типа
if ((get_symbol >= 0x30) && (get_symbol <= 0x7A)) get_symbol = get_symbol;
if (get_symbol < 0x30) get_symbol = 0x30;
if (get_symbol > 0x7A) get_symbol = 0x7A;

Помоги это реализовать, я на 99% уверен что в этом дело!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 16.3.2015, 21:37
Сообщение #24
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Ещё до этого написал как это реализовать, смотри выше.
Если функция get_user_name не поддерживает русские ники её придётся удалить из плагинов или самому редактировать amx. А чтобы крякозябр не было сам сервер должен поддерживать русские ники, если не поддерживает выход один - сторонний плагин. Обнови сервер и amx - до самой последней 1.8.3 сборки, там возможно баг с get_user_name пофиксили. Метамод установи с сайта amx.

Отредактировал: Valer4, - 16.3.2015, 21:56
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
strikerman
сообщение 16.3.2015, 22:40
Сообщение #25
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Цитата(Valer4 @ 16.3.2015, 22:37) *
Ещё до этого написал как это реализовать, смотри выше.
Если функция get_user_name не поддерживает русские ники её придётся удалить из плагинов или самому редактировать amx. А чтобы крякозябр не было сам сервер должен поддерживать русские ники, если не поддерживает выход один - сторонний плагин. Обнови сервер и amx - до самой последней 1.8.3 сборки, там возможно баг с get_user_name пофиксили. Метамод установи с сайта amx.


Ты предлагаешь реализовать это через функцию стороннего плагина. А я предлагаю дописать пару строк в текущий плагин.
Пусть русский ник будет писаться кракозяблями, мне главное чтоб сервер не падал.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
strikerman
сообщение 17.3.2015, 12:28
Сообщение #26
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Короче нужно чтобы в этот плагин вписать функцию проверки символов в нике.
И если ник состоит из юникод символов, то вместо них вывести любые символы с диапазона 0х30...0х71.
Я понимаю что ник нормально писаться не будет, но сервер не будет падать - это главное.

Помогите пожалуйста, я не програмист идею понимаю, но реализовать не могу.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 17.3.2015, 22:21
Сообщение #27
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

вот порядок вызовов форвардов при заходе игрока
client_infochanged
client_connect
client_authorized
client_putinserver
как видишь client_infochanged самый первый, также он вызывается при изменении setinfo или как там его, оно изменяется и при смене ника, то есть в этом событии делаешь проверку на ник.
дальше, смотрел кодировку юникод у неё все буквы кириллицы имеют одинаковый префикс
вот тебе блок работы с битами
#define _is_running(%1) (_running & 1<<%1)
#define _set_running(%1) _running |= 1<<%1
#define _set_no_running(%1) _running &= ~(1<<%1)
запускаешь цикл с шагом в длину ника, получаешь его с помощью get_user_info, ник должен быть записан в _running, длину возвращают charsmax и sizeof, sizeof помоему без нуль символа, то если его то длина равна ему, если charsmax то минус 1, проверка простая if(_is_running(счётчик цикла)) -> a++, после цикла, если a == счётчик цикла / длину шага меняешь ник. Изменить ник с помощью set_user_info.

Отредактировал: Valer4, - 17.3.2015, 22:24
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
strikerman
сообщение 17.3.2015, 22:35
Сообщение #28
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Спасибо.
Я попробую понять, но это очень сложно для меня.

Я понял что ник получается в строчке
for(i = 0; i < inum; i++) {
get_user_name(players[i], name, sizeof(name)-1)

здесь в переменной name будет ник конкретного игрока игрока. Правильно?
Теперь надо эту переменную name проверить посимвольно?
Цикл по количеству символов в имени, как это?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 17.3.2015, 22:52
Сообщение #29
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Код:
new _running

#define _is_running(%1) (_running & 1<<%1)

public client_infochanged(id)
{
static i, a, len, buffer[128], b
a = 0
get_user_info(id, "name", buffer, 127)
len = sizeof(buffer)
for(i = 0; i < len; i + 2) // если два байта 1 символ
{
_is_running = buffer[i]
if(_is_running(1))
a ++
if(!_is_running(2))
a ++
if(a > 1)
b ++
}
if(b == len)
set_user_info(id, "name", "bydew_bez_nika)")
}


Отредактировал: Valer4, - 17.3.2015, 23:10
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
strikerman
сообщение 18.3.2015, 14:44
Сообщение #30
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Цитата(Valer4 @ 17.3.2015, 23:52) *
Код:
new _running

#define _is_running(%1) (_running & 1<<%1)

public client_infochanged(id)
{
static i, a, len, buffer[128], b
a = 0
get_user_info(id, "name", buffer, 127)
len = sizeof(buffer)
for(i = 0; i < len; i + 2) // если два байта 1 символ
{
_is_running = buffer[i]
if(_is_running(1))
a ++
if(!_is_running(2))
a ++
if(a > 1)
b ++
}
if(b == len)
set_user_info(id, "name", "bydew_bez_nika)")
}



Эту функцию достаточно добавить в текущий плагин, в любое место.
Или её надо "прикрутить" переприсвоив какието переменные?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 18.3.2015, 16:44
Сообщение #31
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Цитата(strikerman @ 18.3.2015, 16:44) *
Эту функцию достаточно добавить в текущий плагин, в любое место.
Или её надо "прикрутить" переприсвоив какието переменные?

Тебе надо посмотреть кодировку utf8, какой префикс у русских букв, там они могут быть в десятичной или шестнадцатеричной системе, нужно перевести префикс в двоичную и ты будешь знать каждый бит 1 или 0 в байте префикса, и сравнивать.
В примере если первый бит 1, а второй 0 то значит юникод, но там скорее всего префикс байт занимает, то есть 8 битов, а символ два байта, то есть шаг цикла + 2 и снова попадаешь на префикс, а сравнивать лучше не 2 бита а 8 если префикс на 8 бит.

Код:
#include <amxmodx>

new _running

#define _is_running(%1) (_running & 1<<%1)

public plugin_init()
register_plugin("UTF Nick Delete", "1.0", "Valer4")

public client_infochanged(id)
{
static i, a, len, buffer[128], b
a = 0
get_user_info(id, "name", buffer, 127)
len = sizeof(buffer)
for(i = 0; i < len; i += 2) // если два байта 1 символ
{
_running = buffer[i]
if(_is_running(1))
a ++
if(!_is_running(2))
a ++
if(_is_running(3))
a ++
if(!_is_running(4))
a ++
if(_is_running(5))
a ++
if(!_is_running(6))
a ++
if(_is_running(7))
a ++
if(!_is_running(8))
a ++
if(a > 7)
b ++
}
if(b == len)
set_user_info(id, "name", "bydew_bez_nika)")
}


Правильно расставить восклицательные знаки только осталось.

Отредактировал: Valer4, - 18.3.2015, 17:01
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
strikerman
сообщение 18.3.2015, 18:49
Сообщение #32
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Погоди.
Мне не нужно чтобы в игре удалялись все юникод-ники.
Они же нормально отображаются в таблице счёта и чате.

Мне нужно чтобы только в плагине amx_ips этих ников не было и всё!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 18.3.2015, 18:57
Сообщение #33
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

А что мешает заменить get_user_name на get_user_info или в тот плагин этот код вставить.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
strikerman
сообщение 18.3.2015, 23:18
Сообщение #34
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Цитата(Valer4 @ 18.3.2015, 20:57) *
А что мешает заменить get_user_name на get_user_info или в тот плагин этот код вставить.


1. Замена get_user_name на get_user_info не помогает, сервер все равно крашится
я тогда ошибочно отписал, что помогло, на самом деле эти функции работают одинаково.

2. Я просто не пойму как именно ваш плагин вставить.
Если бы там была функция которую надо заменить, а не просто кусок кода.
Можете дать уже целый плагин
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
strikerman
сообщение 19.3.2015, 20:41
Сообщение #35
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Цитата(Valer4 @ 18.3.2015, 17:44) *
Тебе надо посмотреть кодировку utf8, какой префикс у русских букв, там они могут быть в десятичной или шестнадцатеричной системе, нужно перевести префикс в двоичную и ты будешь знать каждый бит 1 или 0 в байте префикса, и сравнивать.
В примере если первый бит 1, а второй 0 то значит юникод, но там скорее всего префикс байт занимает, то есть 8 битов, а символ два байта, то есть шаг цикла + 2 и снова попадаешь на префикс, а сравнивать лучше не 2 бита а 8 если префикс на 8 бит.

Код:
#include <amxmodx>

new _running

#define _is_running(%1) (_running & 1<<%1)

public plugin_init()
register_plugin("UTF Nick Delete", "1.0", "Valer4")

public client_infochanged(id)
{
static i, a, len, buffer[128], b
a = 0
get_user_info(id, "name", buffer, 127)
len = sizeof(buffer)
for(i = 0; i < len; i += 2) // если два байта 1 символ
{
_running = buffer[i]
if(_is_running(1))
a ++
if(!_is_running(2))
a ++
if(_is_running(3))
a ++
if(!_is_running(4))
a ++
if(_is_running(5))
a ++
if(!_is_running(6))
a ++
if(_is_running(7))
a ++
if(!_is_running(8))
a ++
if(a > 7)
b ++
}
if(b == len)
set_user_info(id, "name", "bydew_bez_nika)")
}


Правильно расставить восклицательные знаки только осталось.



Пожалуйста помогите вставить этот кусок в плагин с 1 поста, скопировать я туда могу,
но надо грамотно передать используемые переменнве.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 20.3.2015, 0:34
Сообщение #36
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Цитата(strikerman @ 19.3.2015, 22:41) *
Пожалуйста помогите вставить этот кусок в плагин с 1 поста, скопировать я туда могу,
но надо грамотно передать используемые переменнве.

Это не из-за ника, проверил, отладочную информацию не пишет.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
strikerman
сообщение 20.3.2015, 10:09
Сообщение #37
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Цитата(Valer4 @ 20.3.2015, 1:34) *
Это не из-за ника, проверил, отладочную информацию не пишет.


Что не из-за ника?? Не понял что вы сказли.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 20.3.2015, 12:42
Сообщение #38
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Заходил со стима с русским ником получал ник с помощью get_user_info и get_user_name, даже выводиться нормально, брал код с плагина в котором он участвует тоже краша нет, отключал вывод мотд всё равно краш, это точно не из-за ника.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
strikerman
сообщение 20.3.2015, 13:45
Сообщение #39
Стаж: 11 лет

Сообщений: 67
Благодарностей: 5
Полезность: 46

Цитата(Valer4 @ 20.3.2015, 13:42) *
Заходил со стима с русским ником получал ник с помощью get_user_info и get_user_name, даже выводиться нормально, брал код с плагина в котором он участвует тоже краша нет, отключал вывод мотд всё равно краш, это точно не из-за ника.


Вы не берите сторонний плагин, вы возьмите плагин с первого поста. Потом проверяйте на сервере версии 5787.
При наличии игрока с русским ником, как только пишете в консоль amx_ips и нажмёте энтер - сервер тут-же крашится!
Если русских ников не будет - то выведет окно с никами и айпишниками всех игроков.

А если вы проверяете на версии 6ххх - то конечно краша не будет, так как поддержка юникод ников в 6ххх вшита по умолчанию.

Поэтому мне нужно чтобы в плагине с первого поста при наличии на сервере русского ника заменять его любыми английскими символами,
которые сервер 5787 нормально прожёвывает и падать не будет.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Valer4
сообщение 20.3.2015, 17:50
Сообщение #40
Стаж: 11 лет

Сообщений: 176
Благодарностей: 46
Полезность: < 0

Если закомментировать 86 строчку - format(strbuf[i], 64,"%16s %-28.27s N/A^n", name, ip)

Отредактировал: Valer4, - 21.3.2015, 10:06
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
3 страниц V   1 2 3
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: