По этому я и решил показать универсальный метод ограничения использования команды или функции в одном раунде.
Для реализации данного кода, вы должны уметь работать со следующими функциями:
plugin_init
register_event
register_cvar
get_cvar_num
register_clcmd - Желательно.
client_print - Желательно
Ну что, освоили теорию по необходимым данным? Тогда идем дальше:
Немного теории:
С начала нам нужно немного подумать и прикинуть, как же должен работать плагин.
Выбросите из головы функции и проговорите в слух, что должно происходить и в какой момент, и записывайте все по пункам.
Вот что получилось у меня:
- Игрок первый раз использовал функцию в раунде
- Необходимо это дело запомнить куда то, записать
- Игрок использовал второй раз функцию в том же раунде
- Снова записываем
- Игрок вновь, в третий раз хочет использовать функцию, но мы хотим разрешить только 2 раза.
Значит нужно перед каждым использованием проверять, сколь раз уж использовал игрок эту функцию. - Если игрок уже не может использовать функцию, надо вывести какое то сообщение.
- Каждый раунд счетчик использования функции нужно обнулять
А что вышло у вас? Пишите в комментариях, интересно же ) Не стесняйтесь, может что вместе придумаем
Теперь нам нужно на эту грубую схему найти управу в виде функций, давайте прикинем:
- Нам нужна функция которую игрок использует, или создать свою ( у нас будет test_cmd)
- Нам нужна глобальная переменная для счетчика использования функции ( тоже легко new g_F_counter[33] = 0)
- Прибавлять к переменной по единице когда игрок использует функцию (g_F_counter[id]++)
- Необходимо создать условие ограничения if(g_F_counter[id] <= get_cvar_num("amx_use_fn_in_round")) тут у нас появляется еще и необходимость в кваре, что бы удобно было настраивать готовый плагин
- Вывод сообщения с помощью client_print
- Требуется событие начала раунда ( отловим с помощью register_event)
На этом теория заканчивается, можно приступать к написанию плагина
Написание плагина:
Как мы выше расписали себе план плагина и его работу, приступим с отлова событий, регистрации квара и переменных, так как это следует делать в самом начале плагина, вот что получается:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
//название плагина, версия и автор
#define PLUGIN "Restriction of usage of function in one round"
#define VERSION "1.0"
#define AUTHOR "Admin"
//Глобальный счетчик для каждого игрока
new g_F_counter[33] = 0
public plugin_init() {
//регистрируем плагин и его данные
register_plugin(PLUGIN, VERSION, AUTHOR)
//необходимые нам функции, о которых писалось выше
register_event("ResetHUD","startround","be")
register_cvar("amx_use_fn_in_round","3")
register_clcmd("say /cmd","test_cmd")
}
И так,конфиг у нас готов, теперь сразу же сделаем обнуление счетчика, что бы потом не возвращаться к этому:
public startround(id){
g_F_counter[id] = 0
}
И наконец, наша функция ограничение и подсчета количества использования команды или функции.
public test_cmd(id){
if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
//Выполняется нужная команда, функция и т.п.
client_print(id,print_chat,"[Round counter] You command exec")
g_F_counter[id]++
}else{
//ты исчерпал свои возможности в этом раунде
client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
}
}
Условие говорит нам следующее:
Если ( количество раз использования данной функции меньше значению нашего квара) То выполняем следующий код, в котором прибавляем к счетчику единицу использования функции, если равенство не верно, то выполняем код следующий за конструкцией }else{.
Весь плагин целиком:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#define PLUGIN "Restriction of usage of function in one round"
#define VERSION "1.0"
#define AUTHOR "Admin"
new g_F_counter[33] = 0
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("ResetHUD","startround","be")
register_cvar("amx_use_fn_in_round","3")
register_clcmd("say /cmd","test_cmd")
}
public startround(id){
g_F_counter[id] = 0
}
public test_cmd(id){
if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
//add you code
client_print(id,print_chat,"[Round counter] You command exec")
g_F_counter[id]++
}else{
//ты исчерпал свои возможности в этом раунде
client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
}
}
Как добавить такое ограничение в существующий палигн:
- Необходимо добавить вначале плагина переменную
new g_F_counter[33] = 0
- Внутри функции plugin_init добавить функции
register_event("ResetHUD","startround","be")
register_cvar("amx_use_fn_in_round","3")
register_clcmd("say /cmd","test_cmd") - После plugin_init добавить
public startround(id){
g_F_counter[id] = 0
} - И самое сложное:
Найти в плагине то кусок кода, который вы хотите ограничить в использовании.
Затем перед ним вставить кодif(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
//add you code
client_print(id,print_chat,"[Round counter] You command exec")
g_F_counter[id]++
}else{
//ты исчерпал свои возможности в этом раунде
client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
}
И в место кода://add you code
client_print(id,print_chat,"[Round counter] You command exec")
Вставить всю функцию. - Есть и другой вариант:
Вставить весь этот код.public test_cmd(id){
if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
//add you code
client_print(id,print_chat,"[Round counter] You command exec")
g_F_counter[id]++
}else{
//ты исчерпал свои возможности в этом раунде
client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
}
}
Вместо client_print(id,print_chat,"[Round counter] You command exec") указать вашу функцию в плагине например: my_super_menu(id)
Дальше найти в plugin_init строку, где регистрируется команда и переписать второй параметр - вызываемая функция, на test_cmd
Но этот способ и не красивый и во многих случаях станет не возможным.
Ограничение использования команды,функции в одном раунде по времени!
Например, можно один раз в 5 минут использовать функцию