Русское сообщество по скриптингу

[PAWN]Автоматическое перемещение плагина в нужную позицию.

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

[PAWN]Автоматическое перемещение плагина в нужную позицию.

Сообщение Chuvi » 20 мар 2013, 00:18

Существуют такие плагины, которым крайне желательно находиться где-нибудь в определённом месте, например, ColoredTranslit-у желательно стоять в самом конце списка с плагинами, а AmxBans-у, например, в самом начале.

Данная функция предназначена для автоматического перемещения плагина в нужное место.
В прочем, во избежании конфликтов, рекомендую использовать квар.

[pawn]
  1. /*

  2. Функия "перемещает" плагин на указанную позицию

  3. pos-номер, под которым будет определяться плагин (считается с 1)

  4. mode=SEEK_SET или SEEK_END (по аналогии с fseek, просмотр с начала или с конца)

  5. */

  6.  

  7. long move_plugin(pos,mode)

  8. {

  9.         /* Предостережём от возможного использования SEEK_CUR */

  10.         if(mode==SEEK_CUR)

  11.                 mode=SEEK_SET;

  12.        

  13.         /* Узнаём количество плагинов */

  14.         int plnum=get_pluginsnum();

  15.        

  16.         /*

  17.         Объявляем переменные для хранения информации о плагинах, и отдельно переменную

  18.         для хранения имени файла данного плагина

  19.         */

  20.         char name[32], version[32], author[32], filename[32], status[32];

  21.         char this_filename[32];

  22.        

  23.         /* Получаем информацию о данном плагине */

  24.         get_plugin(-1,this_filename,charsmax(this_filename),name,charsmax(name),version,charsmax(version),author,charsmax(author),status,charsmax(status));

  25.  

  26.         /* Делаем защиту от дурака */

  27.         if(mode<SEEK_SET)

  28.                 mode=SEEK_SET;

  29.         if(mode>SEEK_END)

  30.                 mode=SEEK_CUR

  31.         if(pos<1)

  32.                 pos=1;

  33.         if(pos>plnum)

  34.                 pos=plnum;

  35.        

  36.         /*

  37.         Теперь узнаем, какой индекс должен быть у нашего плагина должен быть наш плагин

  38.         Итак, get_plugin возвратит нам максимальный индекс плагина+1, так как кол-во плагинов

  39.         считается с еденицы, а индекс считается с нуля.

  40.         Значит для того, чтобы узнать, какой индекс должен быть у нашего плагина,

  41.         нужно из pos вычесть 1. Но это прокатит только если мы используем SEEK_SET

  42.         Если же мы используем SEEK_END, нам будет нужно вычесть позицию нашего плагина из общего числа плагинов)

  43.         */

  44.        

  45.         if(mode==SEEK_SET)

  46.         {

  47.                 pos=pos-1;

  48.         }

  49.         else

  50.         {

  51.                 pos=plnum-pos;

  52.         }

  53.        

  54.         /* Получим информацию о плагине с этим индексом, чтобы удостовериться, что это не наш плагин */

  55.         get_plugin(pos,filename,charsmax(filename),name,charsmax(name),version,charsmax(version),author,charsmax(author),status,charsmax(status));

  56.         if(equal(filename,this_filename))

  57.                 return 0;// это таки наш плагин

  58.                

  59.         /* Объявим переменную, в которую запишем путь к plugins.ini и заполним её */

  60.         char plugins_ini_file[100];

  61.         get_localinfo("amxx_plugins",plugins_ini_file,charsmax(plugins_ini_file));

  62.        

  63.         /*Объявим переменную для хранения прочитанной строки из файла */

  64.         char s_buffer[512];

  65.        

  66.         /* Объявим массив, в котором будем хранить прочитанные строки и проинициализируем его */

  67.         void* g_a_data;

  68.         g_a_data=ArrayCreate(sizeof(s_buffer));

  69.        

  70.         /* Открываем файл plugins.ini на чтение */

  71.         FILE* ini=fopen(plugins_ini_file,"rt");

  72.        

  73.         /*

  74.         Так как многие пользователи любят писать в plugins.ini различную дополнительную информацию к плагинам,

  75.         следует учесть, что не каждая строка будет соответствовать объявлению нового плагина

  76.         */

  77.        

  78.         /* Плагин, информация о котором находится в переменных name[32], version[32]...итд...*/

  79.         int CurPlugin=0;

  80.        

  81.         /* Номер читаемой строки */

  82.         int CurLine=0;

  83.        

  84.         /*

  85.         Если в прочитанной строке объявлялся плагин, который валяется в CurPlugin,

  86.         нам нужно будет получить инфу о следующем плагине. Иначе зачем зря дёргать get_plugin(...) ?

  87.         */

  88.         //int UpdateNeeded=0; //В прочем,это нам не понадобится.

  89.                        

  90.         /* строка, на которую мы поместим наш плагин */

  91.         int ThisPluginMoveTo;

  92.        

  93.         /*

  94.         Прочитаем файл в массив, заодно определив,

  95.         на какой строке находится объявление нашего плагина,

  96.         и на какой строке оно должно быть.

  97.         До начала прохода по файлу, прочитаем инфу о 1-м плагине.

  98.         UDP: строку с объявлением нашего плагина в массив записывать не будем. Запишем в отдельную строку.

  99.         */

  100.        

  101.         char ThisPluginLine[512]

  102.        

  103.         get_plugin(CurPlugin,filename,charsmax(filename),name,charsmax(name),version,charsmax(version),author,charsmax(author),status,charsmax(status));

  104.  

  105.         while(!feof(ini))

  106.         {

  107.                 fgets(ini,s_buffer,charsmax(s_buffer));

  108.                 trim(s_buffer);

  109.                

  110.                

  111.                 /*

  112.                 Проверим, не объявляется ли здесь плагин.

  113.                 Так как помимо объявления плагина там может быть ещё и комментарий,

  114.                 сравним только то количество символов, которое есть в filename

  115.                 */

  116.                 if(equal(s_buffer,filename,strlen(filename)))

  117.                 {

  118.                         /*Проверим, не наш ли это плагин */

  119.                         if(equal(this_filename,filename))

  120.                         {       /* Если наш, запишем его в отдельный буфер*/

  121.                                 format(ThisPluginLine,charsmax(ThisPluginLine),"%s",s_buffer);

  122.                         }

  123.                         else

  124.                         {

  125.                                 ArrayPushString(g_a_data,s_buffer);

  126.                                 /*

  127.                                 Проверим, не сюда ли мы хотим поместить наш плагин.

  128.                                 Если мы определяем позицию, куда мы хотим поместить наш плагин с начала,

  129.                                 то нам нужно будет записать объявление нашего плагина перед только что прочитанным.

  130.                                 Иначе-после. Впрочем, лучше учтём это при записи.

  131.                                 */

  132.                                

  133.                                 if(CurPlugin==pos)

  134.                                 {

  135.                                        

  136.                                         /*Я так и не понял почему,

  137.                                         Но при SEEK_CUR нужно уменьшить номер текущей строки

  138.                                         */

  139.                                         if(mode==SEEK_SET)

  140.                                         {

  141.                                                 ThisPluginMoveTo=CurLine;

  142.                                         }

  143.                                         else

  144.                                         {

  145.                                                 ThisPluginMoveTo=CurLine-1;

  146.                                         }

  147.                                                                        

  148.                                 }                                                                                              

  149.                         }

  150.                        

  151.                         CurPlugin++;

  152.                         get_plugin(CurPlugin,filename,charsmax(filename),name,charsmax(name),version,charsmax(version),author,charsmax(author),status,charsmax(status));                       

  153.  

  154.                

  155.                

  156.                 }

  157.                 else

  158.                 {

  159.                         ArrayPushString(g_a_data,s_buffer);

  160.                 }

  161.                 CurLine++;

  162.         }

  163.         /* Файл прочитан, можно закрывать */

  164.         fclose(ini);

  165.        

  166.        

  167.         /*Проверим, не пуст ли массив со строками из файла.

  168.         Заодно сохраним размер массива для дальнейшего использования */

  169.         int ASize;

  170.         if((ASize=ArraySize(g_a_data)))

  171.         {

  172.                 /*Массив не пуст? plugins.ini, давай, досвидания. */

  173.                 delete_file(plugins_ini_file);

  174.         }

  175.         else

  176.         {

  177.                 /*Ошибка какая-то случилась*/

  178.                 return 0;

  179.         }

  180.        

  181.         /*Создадим новый plugins.ini */

  182.         //formatex(plugins_ini_file,charsmax(plugins_ini_file),"%s.new",plugins_ini_file)

  183.         ini=fopen(plugins_ini_file,"wt");

  184.         /*

  185.         Запишем данные, хранящиеся в массиве, обратно в файл,

  186.         не забыв вписать строку с нашим плагином в нужном месте

  187.         */

  188.         for(int i=0;i<ASize-1;i++)

  189.         {

  190.                 ArrayGetString(g_a_data,i,s_buffer,charsmax(s_buffer));

  191.                 if(i==ThisPluginMoveTo)

  192.                 {

  193.                         if(mode==SEEK_SET)

  194.                         {

  195.                                 format(s_buffer,charsmax(s_buffer),"%s^n%s^n",ThisPluginLine,s_buffer);        

  196.                         }

  197.                         else

  198.                         {

  199.                                 format(s_buffer,charsmax(s_buffer),"%s^n%s^n",s_buffer,ThisPluginLine);

  200.                         }

  201.                 }

  202.                 else

  203.                 {

  204.                         format(s_buffer,charsmax(s_buffer),"%s^n",s_buffer);   

  205.                 }

  206.                 fputs(ini,s_buffer);

  207.         }

  208.         ArrayClear(g_a_data);

  209.         fclose(ini);

  210.         server_cmd("restart");

  211.         /*Отчистили массив, закрыли файл, перезагрузили сервак */

  212.         return 1;

  213. }

  214.  
[/pawn]

То есть, если мы хотим, чтобы наш плагин был 3-м с конца, в инициализацию плагина нужно вписать
[pawn]
  1. move_plugin(3,SEEK_END);
[/pawn]

А, да, спасибо Вы должны зарегистрироваться, чтобы видеть ссылки. за Вы должны зарегистрироваться, чтобы видеть ссылки.. Я там подсмотрел идею сохранять эти данные в буфере, а не во временном файле, как я делал раньше.

[spoiler]Для тех, кто сломал мозг :)
[pawn]
  1. #define int new

  2. #define char new

  3. #define long public

  4. #define FILE* new

  5. #define void* static Array: //xD

  6.  
[/pawn][/spoiler]
Последний раз редактировалось Chuvi 20 мар 2013, 17:22, всего редактировалось 1 раз.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: [PAWN]Автоматическое перемещение плагина в нужную позици

Сообщение Chuvi » 21 мар 2013, 01:28

Asmodai, непонял как.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: [PAWN]Автоматическое перемещение плагина в нужную позици

Сообщение Asmodai » 21 мар 2013, 12:42

[pawn]
  1. public plugin_init() set_task( 2.0, "reg_say" )

  2.  

  3. public reg_say() register_clcmd( "say", "cmd_say" )
[/pawn]
Аватара пользователя
Asmodai
Адмирал
 
Сообщения: 466
Зарегистрирован: 24 фев 2011, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 393 раз.
Языки программирования: Counter-Strike 1.6

Re: [PAWN]Автоматическое перемещение плагина в нужную позици

Сообщение BROWN » 22 мар 2013, 02:40

Asmodai писал(а):[pawn]
  1. public plugin_init() set_task( 2.0, "reg_say" )

  2.  

  3. public reg_say() register_clcmd( "say", "cmd_say" )
[/pawn]

Ты хочешь сказать, что если хук сделать позже других плагинов, то этот находясь выше других все равно обрабатывать say будет позже?
Brown_dev
Аватара пользователя
BROWN
 
Сообщения: 986
Зарегистрирован: 25 фев 2012, 23:19
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 411 раз.

Re: [PAWN]Автоматическое перемещение плагина в нужную позици

Сообщение Chuvi » 22 мар 2013, 06:35

Bos93 писал(а):server_print("%i:%s",CurLine,s_buffer)

Нет точки с запятой,всё,плагин не скомпилится.

Спасибо, забыл убрать эту строку.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: [PAWN]Автоматическое перемещение плагина в нужную позици

Сообщение trololost » 22 мар 2013, 12:20

BROWN писал(а):
Asmodai писал(а):[pawn]
  1. public plugin_init() set_task( 2.0, "reg_say" )

  2.  

  3. public reg_say() register_clcmd( "say", "cmd_say" )
[/pawn]

Ты хочешь сказать, что если хук сделать позже других плагинов, то этот находясь выше других все равно обрабатывать say будет позже?


сомневаюсь, это вроде как просто регистрация перехвата, а сам перехват происходит последовательно друг за другом во всех плагинах.
[Не принимаю заказы]
Аватара пользователя
trololost
 
Сообщения: 923
Зарегистрирован: 05 ноя 2011, 02:25
Благодарил (а): 104 раз.
Поблагодарили: 358 раз.

Re: [PAWN]Автоматическое перемещение плагина в нужную позици

Сообщение Asmodai » 22 мар 2013, 13:29

trololost писал(а):сомневаюсь, это вроде как просто регистрация перехвата, а сам перехват происходит последовательно друг за другом во всех плагинах.

Как ты себе это представляешь? Команда последовательно сравнивается со всеми зарегистрированными хуками, плагины в этом процессе не участвуют. Можно наоборот первым сделаться через plugin_precache.
Аватара пользователя
Asmodai
Адмирал
 
Сообщения: 466
Зарегистрирован: 24 фев 2011, 20:48
Благодарил (а): 0 раз.
Поблагодарили: 393 раз.
Языки программирования: Counter-Strike 1.6

Пред.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5