Как сделать включение и выключение функции по команде для каждого игрока.
Все просто, для этого нам поможет булевая переменная. Можно конечно использовать и обычную переменную, но с булевой работать в данном случае логичнее.
Какая же логика у данного процесса?
Для начала нужно определиться будет ли нужная функция при подключении к серверу включена или выключена. Для примера представим, что функция для игрока будет по умолчанию выключена:
new bool:g_bFuncUse [33] = false
В данном коде создается массив из булевых переменных присваивается значение ложь всем массиву. Этот массив и является «переключателем» выключена/выключена функция для каждого из игроков по отдельности. Но как вы уже догадались, сам по себе выключатель ни чего не сделает, его нужно включить в какую то схему, этой схемой будет «Условие» в котором будет проверяться положение «переключателя»:
if(g_bFuncUse[id]){
//Выключатель включен
}else{
//Выключатель выключен
}
Вроде бы как все работает, но чего то не хватает не так ли? Вижу, правильно думаете! Не хватает команды которая будет включать и выключать переключатель. С этим еще проще, регистрируем команду say и создаем для нее функцию:
register_clcmd("say","fOnOff")
...
public fOnOff(id){
//Получение что написал игрок
new args[10]
read_args(args,9)
remove_quotes(args)
//Если было написано /off
if(equal(args, "/off", 4)){
g_bFuncUse[id] = false
client_print(id,print_chat,"[scripts] Cmd disable")
}
//Если было написано /on
if(equal(args, "/on", 4)){
g_bFuncUse[id] = true
client_print(id,print_chat,"[scripts] Cmd is activated")
}
}
Как вы уже догадались, команды у нас будут say /on и say /off.
А так же нельзя забывать, что игрок может выйти и на его место войдет другой, по этому переменную нужно приводить в исходное состояние, например так:
public client_connect(id){
g_bFuncUse[id] = false
}
Можно и при выходе игрока, в теории разницы ни какой нету, все зависит от структуры вашего плагина.
Теперь осталось только сделать какую то наглядную функцию, при включении/выключении которой сразу же будет что то происходить.
Например можно поиграться с гравитацией, так как там значение изменяется всего одной функцией и не повторятся, то можно изменить ее значение прямо где изменяли положение переключателя, но все же хочется привести пример с использованием переключателя в другой функции, для этого возьмем пример плагина бесконечных патронов, добавим в него наши наработки и получим вот что:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }
new const MAXCLIP[] = { -1, 13, -1, 10, -1, 7, -1, 30, 30, -1, 30, 20, 25, 30, 35, 25, 12, 20,
10, 30, 100, 8, 30, 30, 20, -1, 7, 30, 30, -1, 50 }
#define PLUGIN "[scripts] on/off function"
#define VERSION "1.0"
#define AUTHOR "Admin"
new bool:g_bFuncUse[33] = false
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say","fOnOff")
register_message(get_user_msgid("CurWeapon"), "messageCurWeapon")
}
public fOnOff(id){
new args[10]
read_args(args,9)
remove_quotes(args)
if(equal(args, "/off", 4)){
g_bFuncUse[id] = false
client_print(id,print_chat,"[scripts] Cmd disable")
set_user_gravity(id,1.0)
}
if(equal(args, "/on", 4)){
g_bFuncUse[id] = true
client_print(id,print_chat,"[scripts] Cmd is activated")
set_user_gravity(id,0.5)
}
}
public client_connect(id){
g_bFuncUse[id] = false
}
public messageCurWeapon(msg_id, msg_dest, msg_entity){
if(!g_bFuncUse[msg_entity])
return PLUGIN_CONTINUE
if(get_msg_arg_int(1) != 1)
return PLUGIN_CONTINUE
static weapon
weapon = get_msg_arg_int(2)
if(MAXBPAMMO[weapon] > 2){
set_pdata_int(get_pdata_cbase(msg_entity, 373), 51, MAXCLIP[weapon], 4)
set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])
}
return PLUGIN_CONTINUE
}
Но в функции messageCurWeapon, использован немного другой способ контроля положения переключателя выл/выкл.
Раньше у нас была логика такая:
Если переключатель включен то:
...
Если нет то
...
А в данном варианте:
if(!g_bFuncUse[msg_entity])
return PLUGIN_CONTINUE
Если переключатель не включен, то возвращаем return PLUGIN_CONTINUE, что прервет дальнейшее выполнение функции.
Как вы понимаете можно было использовать и другой способ, и выглядело бы это так:
public messageCurWeapon(msg_id, msg_dest, msg_entity){
if(g_bFuncUse[msg_entity]){
if(get_msg_arg_int(1) != 1)
return
static weapon
weapon = get_msg_arg_int(2)
if(MAXBPAMMO[weapon] > 2){
set_pdata_int(get_pdata_cbase(msg_entity, 373), 51, MAXCLIP[weapon], 4)
set_msg_arg_int(3, get_msg_argtype(3), MAXCLIP[weapon])
}
}
}
Как видно, сразу же код "уплывает" в право, при том что нет необходимости в этом, необходимость была бы, если дальше был бы еще какой то код, который было бы необходимо выполнить.
Теперь пару слов о том, как можно еще проще использовать команды включения выключения, например если для этого хочется использовать одну команду,а не две разные.
Для этого регистрируется команда:
register_clcmd("say /megakomanda","fOnOff")
А в функции делается проверка на состояние переключателя и переводится в другое положение:
public fOnOff(id){
if(g_bFuncUse[id]){
g_bFuncUse[id] = false
client_print(id,print_chat,"[scripts] Cmd disable")
}else{
g_bFuncUse[id] = true
client_print(id,print_chat,"[scripts] Cmd is activated")
}
}
На самом деле вариантов реализации включения/выключения очень много, все зависит от вашей фантазии.