AMX MOD X
Четверг, 25.04.2024, 19:56:46



Приветствую Вас Гость | RSS
[ Главная ] [ Вывод текста плагина через DATA файл - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Вывод текста плагина через DATA файл (Изменение/Доработка плагина)
Вывод текста плагина через DATA файл
MolkaДата: Четверг, 26.11.2009, 13:25:24 | Сообщение # 1
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
Наверно по названию темы, трудно догадаться чего мне надо... Во общем, есть у меня несколько плагинов которые выводят информацию прямиком из плагина, а мне нужно что бы вывод текста шёл из текстового файла (папка data/lang), как бы добавить мультиязычность в плагин, что бы он мог использовать несколько языков. Объясните пожалуйста как такое реализовать.


В качестве примера, можно попробовать lastround2,
Code
#include <amxmodx>

#pragma semicolon                1      // force ; usage, just 'cause
      
new g_scTitle[]   = "Last Round";
new g_scVersion[] = "1.0";
new g_scAuthor[]  = "bAnTAi";
      
new bool:g_lastround = false;
new bool:g_changemap = false;
new Float:g_timelimit = 0.0;
new Float:g_maxspeed;

#define INITIATE_LAST_ROUND_TASK 545454
#define CHANGE_MAP_TASK 545455
#define DISABLE_PLAYERS_TASK 545456

public evRoundStart() {
  if (!get_cvar_num("lastround")) return PLUGIN_CONTINUE;

  // Wanted this in init but never got a value  
  if (g_timelimit == 0.0)
   g_timelimit = get_cvar_float("mp_timelimit");

  if (g_lastround) {
   new Float:roundtime = get_cvar_float("mp_roundtime");
   new Float:c4timer = get_cvar_float("mp_c4timer")/60;
          // Extend the maps time one round + c4timer + some buffer
          set_cvar_float("mp_timelimit", g_timelimit + roundtime + c4timer + 0.5);
       
   new text[256];
   format(text, 255, "This is the final round");
   doTypesay(text, 5, 210, 0, 0);

   g_changemap = true;
   g_lastround = false;
  } else if (g_changemap) {
   new nextmap[32];
          get_cvar_string("amx_nextmap", nextmap, 31);
   
   new text[256];
   format(text, 255, "Thank you for playing. Now switching to %s!", nextmap);
   doTypesay(text, 5, 210, 0, 0);

   g_maxspeed = get_cvar_float("sv_maxspeed");
   set_cvar_float("sv_maxspeed", 0.0);

                 set_task(0.1, "disablePlayers", DISABLE_PLAYERS_TASK, "", 0, "a", 3);
                 set_task(6.0, "changeMap", CHANGE_MAP_TASK);
  }

         return PLUGIN_CONTINUE;
}

public initiateLastRound() {
  if (!get_cvar_num("lastround")) return PLUGIN_CONTINUE;

  remove_task(INITIATE_LAST_ROUND_TASK);

  new text[256];
  format(text, 255, "The final round is coming up");
         doTypesay(text, 5, 210, 0, 0);

         new Float:roundtime = get_cvar_float("mp_roundtime");
  new Float:c4timer = get_cvar_float("mp_c4timer")/60;

  // (2* roundtime since it is possible that the even occurs at the beginning of a round)
  set_cvar_float("mp_timelimit", g_timelimit + (2.0*roundtime) + (2.0*c4timer));

  g_lastround = true;

  return PLUGIN_CONTINUE;
}

public disablePlayers() {
         new players[32], num;
         get_players(players, num, "c");
         for(new i=0;i<num; i++) {
   client_cmd(players[i],"drop");
  }
}

public changeMap() {
  remove_task(CHANGE_MAP_TASK);

         new nextmap[32];
         get_cvar_string("amx_nextmap", nextmap, 31);
         server_cmd("changelevel %s", nextmap);
}

doTypesay(string[], duration, r, g, b) {
         set_hudmessage(r, g, b, 0.05, 0.45, 0, 6.0, float(duration) , 0.5, 0.15, 4);
         show_hudmessage(0, string);
}
       
public plugin_init() {
         register_plugin(g_scTitle, g_scVersion, g_scAuthor);

         register_cvar("lastround", "1");
  register_logevent("evRoundStart", 2, "0=World triggered", "1=Round_Start");

  // Chose 90 seconds not to clash with other events
  set_task(90.0, "initiateLastRound", INITIATE_LAST_ROUND_TASK, "", 0, "d");

  return PLUGIN_CONTINUE;
}

public plugin_end() {
  set_cvar_float("mp_timelimit", g_timelimit);
  set_cvar_float("sv_maxspeed", g_maxspeed);

  remove_task(DISABLE_PLAYERS_TASK);

  return PLUGIN_CONTINUE;
}


Совершенный человек все ищет в себе, ничтожный — в других...
 
tavotДата: Пятница, 27.11.2009, 10:50:44 | Сообщение # 2
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Molka,
Не проще посомтреть готовый плагин антифлуд?

Code
#include <amxmodx>

new Float:g_Flooding[33] = {0.0, ...}
new g_Flood[33] = {0, ...}

new amx_flood_time;

public plugin_init()
{
  register_plugin("Anti Flood", AMXX_VERSION_STR, "AMXX Dev Team")
  register_dictionary("antiflood.txt") // Словарь
  register_clcmd("say", "chkFlood")
  register_clcmd("say_team", "chkFlood")
  amx_flood_time=register_cvar("amx_flood_time", "0.75")
}

public chkFlood(id)
{
  new Float:maxChat = get_pcvar_float(amx_flood_time)

  if (maxChat)
  {
   new Float:nexTime = get_gametime()
    
   if (g_Flooding[id] > nexTime)
   {
    if (g_Flood[id] >= 3)
    {
     client_print(id, print_notify, "** %L **", id, "STOP_FLOOD") // На сколько я понимаю %L - обозначает что это берется из языкового файла ,а STOP_FLOOD - что берем из файла.
     g_Flooding[id] = nexTime + maxChat + 3.0
     return PLUGIN_HANDLED
    }
    g_Flood[id]++
   }
   else if (g_Flood[id])
   {
    g_Flood[id]--
   }
    
   g_Flooding[id] = nexTime + maxChat
  }

  return PLUGIN_CONTINUE
}

В словаре:
[en]
STOP_FLOOD = Stop flooding the server!

Соответственно будет отображатсья

** Stop flooding the server! **

Где ** - из самого плагина, а текст из языкового файла.

Поправьте меня если я в чем то заблуждаюсь!

 
MolkaДата: Пятница, 27.11.2009, 14:36:44 | Сообщение # 3
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
tavot, а регистрировать словарь где в моём примере,
Code
register_dictionary("antiflood.txt")

Code
public plugin_end() {  
   set_cvar_float("mp_timelimit", g_timelimit);  
   set_cvar_float("sv_maxspeed", g_maxspeed);  

   remove_task(DISABLE_PLAYERS_TASK);  

   return PLUGIN_CONTINUE;  
}

Здесь ? верно ? Эта конец кода, разница есть где ? в начале или в конце ?

Quote (tavot)
а STOP_FLOOD - что берем из файла

А если у меня фраза, к примеру "Карта сменится на nextmap (переменная) через xx (переменная)... как будет выглядет
lang:
mapch=Карта сменится на
herez=через
client_print(id, print_notify, "%L

Не не понимаю, куда %L втыкать...


Совершенный человек все ищет в себе, ничтожный — в других...
 
tavotДата: Пятница, 27.11.2009, 15:35:17 | Сообщение # 4
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
Molka,
словарь регишь в plugin_init

client_print(id, print_notify, " %L %S %D ", id, "MAPCH", nextmap, "HEREZ" , xx)

Попробуй так
Толкьо у тебя должны быть эти две переменные
naextmap и xx

Я сам не юзал это дело, но как то смотрел и вроде разбирался....

Так же в словаре можно писать вида
[en]
STOP_FLOOD = Stop flooding the server! %S

Где в функции %S - будет username

Вобщем поксперементируй.
Там варантов мало. В стандартных амхх плагинах много разных примеров.

 
MolkaДата: Пятница, 27.11.2009, 18:43:21 | Сообщение # 5
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
Не не получается...

Code
#include <amxmodx>      

#pragma semicolon                1      // force ; usage, just 'cause      
                
new g_scTitle[]   = "Last Round";      
new g_scVersion[] = "1.0";      
new g_scAuthor[]  = "bAnTAi";      
                
new bool:g_lastround = false;      
new bool:g_changemap = false;      
new Float:g_timelimit = 0.0;      
new Float:g_maxspeed;      

#define INITIATE_LAST_ROUND_TASK 545454      
#define CHANGE_MAP_TASK 545455      
#define DISABLE_PLAYERS_TASK 545456      

public evRoundStart() {      
       if (!get_cvar_num("lastround")) return PLUGIN_CONTINUE;      

       // Wanted this in init but never got a value       
       if (g_timelimit == 0.0)      
        g_timelimit = get_cvar_float("mp_timelimit");      

       if (g_lastround) {      
        new Float:roundtime = get_cvar_float("mp_roundtime");      
        new Float:c4timer = get_cvar_float("mp_c4timer")/60;      
               // Extend the maps time one round + c4timer + some buffer      
               set_cvar_float("mp_timelimit", g_timelimit + roundtime + c4timer + 0.5);      
                 
        new text[256];      
       format(text, 255, "%L", "FINAL_ROUND");
        doTypesay(text, 5, 210, 0, 0);      

        g_changemap = true;      
        g_lastround = false;      
       } else if (g_changemap) {      
        new nextmap[32];      
               get_cvar_string("amx_nextmap", nextmap, 31);      
             
        new text[256];      
        format(text, 255, "Thank you for playing. Now switching to %s!", nextmap);      
        doTypesay(text, 5, 210, 0, 0);      

        g_maxspeed = get_cvar_float("sv_maxspeed");      
        set_cvar_float("sv_maxspeed", 0.0);      

                      set_task(0.1, "disablePlayers", DISABLE_PLAYERS_TASK, "", 0, "a", 3);      
                      set_task(6.0, "changeMap", CHANGE_MAP_TASK);      
       }      

              return PLUGIN_CONTINUE;      
}      

public initiateLastRound() {      
       if (!get_cvar_num("lastround")) return PLUGIN_CONTINUE;      

       remove_task(INITIATE_LAST_ROUND_TASK);      

       new text[256];      
       format(text, 255, "The final round is coming up");      
              doTypesay(text, 5, 210, 0, 0);      

              new Float:roundtime = get_cvar_float("mp_roundtime");      
       new Float:c4timer = get_cvar_float("mp_c4timer")/60;      

       // (2* roundtime since it is possible that the even occurs at the beginning of a round)      
       set_cvar_float("mp_timelimit", g_timelimit + (2.0*roundtime) + (2.0*c4timer));      

       g_lastround = true;      

       return PLUGIN_CONTINUE;      
}      

public disablePlayers() {      
              new players[32], num;      
              get_players(players, num, "c");      
              for(new i=0;i<num; i++) {      
        client_cmd(players[i],"drop");      
       }      
}      

public changeMap() {      
       remove_task(CHANGE_MAP_TASK);      

              new nextmap[32];      
              get_cvar_string("amx_nextmap", nextmap, 31);      
              server_cmd("changelevel %s", nextmap);      
}      

doTypesay(string[], duration, r, g, b) {      
              set_hudmessage(r, g, b, 0.05, 0.45, 0, 6.0, float(duration) , 0.5, 0.15, 4);      
              show_hudmessage(0, string);      
}      
                 
public plugin_init() {      
              register_plugin(g_scTitle, g_scVersion, g_scAuthor);      

              register_cvar("lastround", "1");      
       register_logevent("evRoundStart", 2, "0=World triggered", "1=Round_Start");      

       // Chose 90 seconds not to clash with other events      
       set_task(90.0, "initiateLastRound", INITIATE_LAST_ROUND_TASK, "", 0, "d");      

       return PLUGIN_CONTINUE;      
}      

public plugin_end() {      
       set_cvar_float("mp_timelimit", g_timelimit);      
       set_cvar_float("sv_maxspeed", g_maxspeed);      

       remove_task(DISABLE_PLAYERS_TASK);      

       return PLUGIN_CONTINUE;      
}

В консоле сервера, просит дебуг и ругается на аргументы:

Quote
L 11/27/2009 - 18:41:52: String formatted incorrectly - parameter 4 (total 4)
L 11/27/2009 - 18:41:52: [AMXX] Run time error 25 (plugin "lastround2.amxx") - debug not enabled!
L 11/27/2009 - 18:41:52: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).

Вот код, на который наверняка ругается....
Code
format(text, 255, "%L", "FINAL_ROUND");
doTypesay(text, 5, 210, 0, 0);

P.S> Словарь зарегистрирован...


Совершенный человек все ищет в себе, ничтожный — в других...

Сообщение отредактировал Molka - Пятница, 27.11.2009, 18:46:19
 
tavotДата: Суббота, 28.11.2009, 15:11:34 | Сообщение # 6
Генерал-майор
Группа: Пользователи
Сообщений: 256
Репутация: 3
Статус: Не в сети
L 11/27/2009 - 18:41:52: String formatted incorrectly - parameter 4 (total 4)

Сначала рзаберись с простым client_print ....

format(text, 255, "%L", "FINAL_ROUND");
doTypesay(text, 5, 210, 0, 0); - это дело без языкового файла работало?

 
MolkaДата: Воскресенье, 29.11.2009, 04:38:40 | Сообщение # 7
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
Quote (tavot)
Сначала рзаберись с простым client_print ....

Долго... смысл один и тот же.

Quote
format(text, 255, "This is the final round");
doTypesay(text, 5, 210, 0, 0);

Вот так работало.

Добавлено (29.11.2009, 04:38:40)
---------------------------------------------
help


Совершенный человек все ищет в себе, ничтожный — в других...
 
a_aquaДата: Воскресенье, 29.11.2009, 18:41:46 | Сообщение # 8
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 3
Статус: Не в сети
Lang:
Quote
1_TEST = privet %s, nextmap: %s

Plugin:
Quote
format(text, 255, "%L", LANG_SERVER, "FINAL_ROUND", nickname, nextmap);
 
MolkaДата: Воскресенье, 29.11.2009, 19:09:46 | Сообщение # 9
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
Спасибо, а с lastround2 как надо...

Совершенный человек все ищет в себе, ничтожный — в других...
 
a_aquaДата: Воскресенье, 29.11.2009, 21:48:11 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 3
Статус: Не в сети
А что там такого?
 
MolkaДата: Воскресенье, 29.11.2009, 22:35:30 | Сообщение # 11
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
Quote
format(text, 255, "%L", "FINAL_ROUND");
doTypesay(text, 5, 210, 0, 0);

Пишет,
L 11/27/2009 - 18:41:52: String formatted incorrectly - parameter 4 (total 4)
L 11/27/2009 - 18:41:52: [AMXX] Run time error 25 (plugin "lastround2.amxx") - debug not enabled!
L 11/27/2009 - 18:41:52: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).


Совершенный человек все ищет в себе, ничтожный — в других...
 
PomanoBДата: Воскресенье, 29.11.2009, 22:49:56 | Сообщение # 12
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Code
format(text, 255, "%L", LANG_SERVER, "FINAL_ROUND");


http://romanov4400.mybrute.com
 
a_aquaДата: Понедельник, 30.11.2009, 08:30:30 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 64
Репутация: 3
Статус: Не в сети
Quote (PomanoB)
format(text, 255, "%L", LANG_SERVER, "FINAL_ROUND");

Чорт, ошибки из-за LANG_SERVER все-таки появляются? :\
 
MolkaДата: Понедельник, 30.11.2009, 11:44:57 | Сообщение # 14
Подполковник
Группа: Пользователи
Сообщений: 120
Репутация: 0
Статус: Не в сети
PomanoB, a_aqua, спасибо.

Всё получилось, но язык выводится серверный (тот который установлен в vault - server_language), а мне необходимо что бы выводил тот который на клиенте. К примеру как в amxmodxmenu, установлен русский - русское меню, английский - английский...


Совершенный человек все ищет в себе, ничтожный — в других...
 
PomanoBДата: Понедельник, 30.11.2009, 17:51:24 | Сообщение # 15
Генералиссимус
Группа: Cупер-модеры
Сообщений: 1313
Репутация: 70
Статус: Не в сети
Вместо LANG_SERVER пиши id игрока которому будет сообщение

http://romanov4400.mybrute.com
 
AMX Mod X Форум » Скриптинг » Помощь по скриптингу » Вывод текста плагина через DATA файл (Изменение/Доработка плагина)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

AMX Mod X Russian Community © 2006-2024