[Plugin] imessage - очень быстрый доступ к строчкам
#1

imessage v1.0.0 + dll


Версия: 1.0.0
[+] добавлена поддержка языков: uk, cs, pl, tr, sr, bg, ro
[+] dll
[+] диалоги в скрипте


Версия: 0.94
[x] баг: крах сервера через некоторое время работы плагина фикс: сервер не крашит
[x] баг: зависание сервера при перезагрузке скрипта фикс: сервер больше не виснет
[x] баг: изменения файла не отображались на сервере фикс: изменения сразу же отображаются на сервере, без перезагрузки плагина
[+] close_ifile(void);


Плагин предоставляет быстрый доступ к неограниченному количеству именованных строк с переводами на различные языки.

Функции:
native init_ifile(in_filename[]); //задаёт имя файла со строчками (должен лежать в одной папке с сервером)
native close_ifile(); //закрывает файл
native imessage(out_text[], in_str_name[], in_langauge[]); //получает строчку с именем in_str_name[] на языке language[]

Память под файл выделяется самим плагином при помощи отображения в память (один раз), что даёт колоссальную скорость доступа и не ограничивает размеры самого файла. Также, строки сохраняют все национальные символы (для поддерживаемых языков) и могут быть отправлены в чат без искажений. Файл можно редактировать во время работы плагина, все изменения вступят в силу сразу после сохранения.

Пример файла со строками:
Код:
#international message file
#imessage v1.0.0 by Bombo is needed
#Поддерживаемые языки: "ru","en","fr","uk","es","cs","de","it","pl","tr","sr","bg","ro"
#
#Формат имени сообщения: "\n[MESSAGE_NAME]\n", имя сообщения всегда латинскими буквами
#Формат задания языка: "\nxx {", где xx - обозначение языка, всегда 2 латинских символа
#Формат конца строчки: "};\n", все три символа должны находиться рядом, без пробелов
#В конце файла обязательно: "\n\n" (!), иначе потеряется последнее сообщение
#
#Кодировка файла: UTF8
#Конец строки: Unix
#
#Файл практически не имеет ограничения по объёму.
#Расположение: в одной директории с samp03svr

[HELLO_MESSAGE]
en {Set your language};
ru {Укажите ваш язык};

[YOUR_LANGUAGE]
en {Your language: };
ru {Ваш язык: };
es {Su idioma: };

[HELPLANG]
en {{00FF00}/lang <xx> {FFCC00}- set your language, xx: {FF0000}en,ru,es};
es {{00FF00}/lang <xx> {FFCC00}- seleccione su idioma, xx: {FF0000}en,ru,es};
ru {{00FF00}/lang <xx> {FFCC00}- укажите ваш язык, xx: {FF0000}en,ru,es};

[HELPSHOW]
en {{00FF00}/show {FFCC00}- show you language of all online players.};
es {{00FF00}/show {FFCC00}- mostrarle país y el idioma los jugadores en línea.};
ru {{00FF00}/show {FFCC00}- язык всех онлайн игроков.};
#fr {...};

[NEWLANG]
en {Your language is: };
es {Ahora su idioma: };
ru {Теперь ваш язык: };

[COMMAND_USAGE]
en {Usage: };
es {Uso: };
ru {Использование команды: };
Файл должен строго соответствовать формату, описанному в начале примера.

Пример использования в скрипте:
PHP код:
#include <a_samp>
...
#include <imessage>
...
public 
OnFilterScriptInit()
{
    ...
    
//указываем файл со строками, который должен
    //лежать в одной папке с сервером samp03svr
    
init_ifile("pattern.txt"); 
    ...
    return 
1;
}
public 
OnFilterScriptExit()
{
    ...
    
//закрываем файл (для избежания утечки памяти)
    
close_ifile(); 
    ...
    return 
1;
}
public 
OnPlayerConnect(playerid//или в любой другой функции
{
    new 
imes[128]; //заранее выделяем память под строчку
    
...
    
//запрашиваем строчку с нужным переводом
    
imessage(imes"HELLO_MESSAGE""ru");
    
//собственно, используем эту строчку как угодно
    
SendClientMessage(playerid0xAAFF00AAimes);
    ...
    return 
1

Результат работы:




Плагин протестирован на v0.3e, v0.3x, 0.3z, 0.3.7. Ось: CentOS 4, Ubuntu 15.10.

Работу плагина можно посмотреть на серверах, которые указаны в подписи.
Reply
#2

dll не будет?
Reply
#3

Quote:
Originally Posted by Bombo
Посмотреть сообщение
Плагин протестирован на SAMP v0.3e.
Сворачиваемся и уходим
Reply
#4

Quote:
Originally Posted by Mance
Посмотреть сообщение
dll не будет?
нет, не планировалось. а смысл?

Quote:
Originally Posted by ParanoidZ
Посмотреть сообщение
Сворачиваемся и уходим
у 0.3x появились фанаты? вот уж не думал...

p.s. тест на 0.3x успешно пройден
Reply
#5

Quote:
Originally Posted by Bombo
Посмотреть сообщение
нет, не планировалось. а смысл?
Не все серверы же на Linux.
Reply
#6

Кончено хорошо, но негде использовать. Чаще всего игрок выбирает сервер с языком, на котором он говорит. Если русскоязычный игрок, играет на русскоязычных серверах, англоязычный - на англоязычных, и так далее
Reply
#7

Quote:
Originally Posted by ulanzetz
Посмотреть сообщение
Кончено хорошо, но негде использовать. Чаще всего игрок выбирает сервер с языком, на котором он говорит. Если русскоязычный игрок, играет на русскоязычных серверах, англоязычный - на англоязычных, и так далее
На моем сервере все наоборот. Иностранцев просто дофига и все хотят перевода сервера на их язык.
Reply
#8

Код:
  
  if(strncmp(in_language, "ru", 2) == 0)
  {
    conv = iconv_open("CP1251", "UTF8");
  }
  else
  {
     conv = iconv_open("CP1252", "UTF8");
  }
					 
  if(conv == (iconv_t)(-1))
    return;
Я не уверен, но использовать iconv каждый вызов функции GetString на мой взгляд это весьма тормознуто.
Reply
#9

Что мешает создать глобальный массив и загружать в него соответствующие данные стандартными средствами? Чем данный метод будет быстрее?
Reply
#10

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
Код:
  
  if(strncmp(in_language, "ru", 2) == 0)
  {
    conv = iconv_open("CP1251", "UTF8");
  }
  else
  {
     conv = iconv_open("CP1252", "UTF8");
  }
					 
  if(conv == (iconv_t)(-1))
    return;
Я не уверен, но использовать iconv каждый вызов функции GetString на мой взгляд это весьма тормознуто.
Само по себе конвертирование (=побайтовое копирование области памяти), думаю, ни у кого не вызовет вопросов о скорости выполнения. А вот каждый раз вызывать iconv_open() - меня, честно говоря, тоже смущало.. И решение было очевидным - создать несколько полей вида conv1251, conv1252, и вызвать iconv_open() пару раз в конструкторе. Но! После следующего теста такая надобность отпала.

Тест:
PHP код:
#include<stdio.h>
#include<iconv.h>
#include<time.h>
#include<unistd.h>
#include<string.h>
#define CONVERTS 1000000
int main(int argcchar *argv[])
{
  
clock_t tm1tm2;
  
long i;
  
char str[]="самая обычная, не длинная и не короткая строчка, которая отправляется в чат";
  
char buff[256];
  
iconv_t conv;
  
size_t size_insize_out;
  
char *ptr_in, *ptr_out;
  
//тест №1
  
memset(buff0sizeof(buff));
  
tm1 clock();
  
//конвертируем бедную строчку до посинения..
  
for(0CONVERTS; ++i)
  {
    
conv iconv_open("CP1251""UTF8"); //вызываем каждый раз в цикле
    
ptr_in str;
    
size_in strlen(str);
    
ptr_out buff;
    
size_out sizeof(buff);
    
iconv(conv, &ptr_in, &size_in, &ptr_out, &size_out);
    
iconv_close(conv);
  }
  
tm2 clock();
  
fprintf(stderr"результат теста №1 (%d циклов): %.3f сек\n"CONVERTS, (tm2-tm1-0.0)/CLOCKS_PER_SEC);
  
fprintf(stderr"%s\n"str);
  
fprintf(stderr"%s\n"buff);
  
//тест №2
  
memset(buff0sizeof(buff));
  
tm1 clock();
  
conv iconv_open("CP1251""UTF8"); //вызываем один раз перед циклом
  
for(0CONVERTS; ++i)
  {
    
ptr_in str;
    
size_in strlen(str);
    
ptr_out buff;
    
size_out sizeof(buff);
    
iconv(conv, &ptr_in, &size_in, &ptr_out, &size_out);
  }
  
iconv_close(conv);
  
tm2 clock();
  
fprintf(stderr"результат теста №2 (%d циклов): %.3f сек\n"CONVERTS, (tm2-tm1-0.0)/CLOCKS_PER_SEC);
  
fprintf(stderr"%s\n"str);
  
fprintf(stderr"%s\n"buff);
  return 
0;

Результат:


Quote:
Originally Posted by AirKite
Посмотреть сообщение
Что мешает создать глобальный массив и загружать в него соответствующие данные стандартными средствами? Чем данный метод будет быстрее?
Ничего не мешает, ничем не быстрее (большая скорость - если сравнивать со скриптом). Но так удобней! Хотя бы потому, что можно редактировать файл без перезагрузки плагина, и все изменения сразу вступят в силу.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)