| 
 
 
	
		
		
			| Серверные Переменные |  |  |  | 
| _wS_ | Дата: Пятница, 13.01.2012, 23:26:53 | Сообщение # 1 |  |   | Создают переменные обычно сразу же после включение скрипта в OnPluginStart.
 
 Код native Handle:CreateConVar(const String:name[],const String:значение[],
 const String:описание[]="",
 флаги=0,
 bool:hasMin=false,
 Float:min=0.0,
 bool:hasMax=false,
 Float:max=0.0);
 
 Код name - имя переменнойhasMin - будет ли она иметь минимальное значение
 min - если да, то какое
 bool:hasMax - будет ли она иметь максимальное значение
 Float:max - если да, то какое
 Самое главное это два первых параметра: 'name' и 'значение', остальное не обязательно.
 
 
 Код public OnPluginStart(){
 CreateConVar("x", "1");
 CreateConVar("y", "7.5");
 CreateConVar("nick", "kot");
 
 GetVars1();
 }
 
 GetVars1()
 {
 new Handle:h = FindConVar("x");
 new x = h ? GetConVarInt(h) : 0;
 
 new Float:y = (h = FindConVar("y")) ? GetConVarFloat(h) : 0.0;
 
 decl String:nick[32];
 if ((h = FindConVar("nick"))) {
 GetConVarString(h, nick, sizeof(nick));
 }
 else {
 nick[0] = 0;
 }
 
 PrintToServer("GetVars1:");
 PrintToServer("x = %d, y = %.1f, nick = %s", x, y, nick);
 
 GetVars2();
 }
 
 GetVars2()
 {
 // Меняем значения
 SetConVarInt(FindConVar("x"), 3); // Здесь тоже нужно проверять был ли найден cvar, но для теста пишем так.
 SetConVarFloat(FindConVar("y"), 3.0);
 SetConVarString(FindConVar("nick"), "tod");
 
 // Показываем новые
 new x = GetConVarInt(FindConVar("x"));
 new Float:y = GetConVarFloat(FindConVar("y"));
 decl String:nick[32];
 GetConVarString(FindConVar("nick"), nick, sizeof(nick));
 
 PrintToServer("GetVars2:");
 PrintToServer("x = %d, y = %.1f, nick = %s", x, y, nick);
 }
 В результате должно выдать:
 
 
 Код GetVars1:x = 1, y = 7.5, nick = kot
 GetVars2:
 x = 3, y = 3.0, nick = tod
 FindConVar("var") - ищет 'var' и возвращает его Handle, или INVALID_HANDLE, если не нашел.
 CreateConVar("var", "var_value"); - создает переменную и возвращает её Handle.
 
 Чтобы часто не использовать функцию FindConVar("var"), создайте глобальную переменную:
 
 
 Код new Handle:g_hVar;
 public OnPluginStart()
 {
 g_hVar = CreateConVar("x", "1");
 go();
 }
 
 go
 {
 PrintToServer("x = %d", GetConVarInt(g_hVar));
 SetConVarInt(g_hVar, 9);
 PrintToServer("x = %d", GetConVarInt(g_hVar));
 }
 SetConVarInt(Handle:convar, value, bool:replicate=false, bool:notify=false);
 
 
 Код replicate - Если true, то новое значение ConVar будет установлено на всех клиентах.Это будет работать только если ConVar имеет FCVAR_REPLICATED флаг и если такой клиентский cvar существует.
 
 notify - Если true, то клиенты будут уведомлены, что ConVar изменился.
 Это будет работать только если ConVar имеет FCVAR_NOTIFY флаг.
 |  |  |  |  |  | 
| _wS_ | Дата: Суббота, 14.01.2012, 00:26:06 | Сообщение # 2 |  |   | Можете создать файл cstrike/cfg/xz.cfg с вашими переменными, и после того, как они были созданы (CreateConVar) в вашем скрипте, сделать: ServerCommand("exec xz.cfg"); чтобы изменить значения на те, что в вашем xz.cfg. 
 CreateConVar("x", "1"); выглядит в файле .cfg так:
 
 
 |  |  |  |  |  | 
| Vitaminoz | Дата: Среда, 22.01.2014, 19:10:32 | Сообщение # 3 |  |   
|  |  | Сообщений: 141 Репутация: 1 [ +/- ]
 |  | В каких случаях лучше использовать ServerCommand или SetConVar* |  |  |  |  |  | 
| TEIN | Дата: Среда, 22.01.2014, 19:33:18 | Сообщение # 4 |  |   
|  |  | Сообщений: 563 Репутация: 78 [ +/- ]
 |  | С помощью SetConVar* можно скрыть уведомление о смене переменной |  |  |  |  |  | 
| Vitaminoz | Дата: Среда, 22.01.2014, 19:42:35 | Сообщение # 5 |  |   
|  |  | Сообщений: 141 Репутация: 1 [ +/- ]
 |  | А больше различий нету ? Например что быстрее реагирует и прочее.
 |  |  |  |  |  | 
| www22 | Дата: Воскресенье, 09.06.2019, 18:47:45 | Сообщение # 6 |  |   
|  |  | Сообщений: 84 Репутация: -1 [ +/- ]
 |  | _wS_, у меня какая то проблема непонятная , почему то измененный конфиг , подхватывается со второй карты, после запуска сервера, то есть после смены карты. Мож есть какая тонкость , чтоб новый конфиг сразу после запуска подхватывался ?Вот пример кода :
 
 Код public OnPluginStart()
 {
 CreateConVar("sm_dod_xlog_version", PLUGIN_VERSION, "Extra weapon logging info version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
 Здесь переменные созданные через CreateConVar
 
 HookEvent("dod_stats_player_damage", PlayerDamageEvent);
 
 AutoExecConfig(true, "pt_xlog_overlays_v2")
 }
 
Да и есть один момент , там строчки связанны с материалы(vmt,vtf), мож это как то влияет на этот глюк ..
 
 И Вот это немного не понятно : 2.
 
 Цитата _wS_ (  )  ServerCommand("exec xz.cfg"); Если конфиг у меня создается в "cfg/sourcemod" , нужно писать папку "cfg/" в команду на вызов конфига ?
 А то думал мож ниже добавить ServerCommand , или же надо вообще в другом блоке это делать ?
 
 
 Сообщение отредактировал www22 - Воскресенье, 09.06.2019, 18:49:55 |  |  |  |  |  | 
| MrGreen | Дата: Пятница, 27.10.2023, 20:08:22 | Сообщение # 7 |  |   
|  |  | Сообщений: 21 Репутация: 0 [ +/- ]
 |  | Здравствуйте! Сначала объясню, чтобы была ясна суть проблемы. Пытаюсь сделать возможность изменить настройки плагина через сам плагин, если нужно отключить какой-то функционал, то нужно это сделать в самом конфиге, иначе, после смены карты, значения подгрузятся те, что в кфг. В чем вопрос, возможно ли изменить значение cvar-а в самом кфг файле этого плагина или создавать этот кфг через KeyValues, а потом уже изменить? На данный момент конфигурационный создан через AutoExecConfig. 
 
 Сообщение отредактировал MrGreen - Пятница, 27.10.2023, 20:09:54 |  |  |  |  |  | 
| _wS_ | Дата: Пятница, 27.10.2023, 22:55:23 | Сообщение # 8 |  |   | Не совсем понял, можно пример какой-нибудь?Обычно AutoExecConfig(true, .. достаточно и просто в .cfg меняют настройки.
 Если нужно, чтобы настройки вступили в силу сразу же, а не после смены карты, то квар меняют через rcon и plugin видит это благодаря HookConVarChange.
 |  |  |  |  |  | 
| MrGreen | Дата: Суббота, 28.10.2023, 07:05:31 | Сообщение # 9 |  |   
|  |  | Сообщений: 21 Репутация: 0 [ +/- ]
 |  | Цитата _wS_ (  )  Не совсем понял, можно пример какой-нибудь?
 Например, есть некий плагин, в нем есть возможность отключить функционал, Администратор нажимает пункт отключить и функционал должен отключиться. Но, даже если мы изменим cvar через команду, то в файле cfg он не изменится и после смены карты или перезапуска сервера, он снова будет работать, так как при загрузке, он берет данные уже из конфигурационного файла.
 |  |  |  |  |  | 
| _wS_ | Дата: Суббота, 28.10.2023, 13:44:21 | Сообщение # 10 |  |   | Цитата MrGreen (  )  Например, есть некий плагин, в нем есть возможность отключить функционал, Администратор нажимает пункт отключить и функционал должен отключиться. Но, даже если мы изменим cvar через команду, то в файле cfg он не изменится и после смены карты или перезапуска сервера, он снова будет работать, так как при загрузке, он берет данные уже из конфигурационного файла.Вот, теперь понял. Например, можно такие "изменённые" переменные с их новыми значениями кидать в какой-то глобальный массив внутри plugin'а, а в OnConfigsExecuted пройтись по этому массиву и через SetConVar.. или ServerCommand снова изменить их.
 |  |  |  |  |  | 
| MrGreen | Дата: Суббота, 28.10.2023, 16:43:27 | Сообщение # 11 |  |   
|  |  | Сообщений: 21 Репутация: 0 [ +/- ]
 |  | Цитата _wS_ (  )  Вот, теперь понял. Например, можно такие "изменённые" переменные с их новыми значениями кидать в какой-то глобальный массив внутри plugin'а, а в OnConfigsExecuted пройтись по этому массиву и через SetConVar.. или ServerCommand снова изменить их.Но что делать с перезагрузкой сервера? Массив тоже пропадет. Я искал информацию много где, но не нашел более адекватного решения проблемы, кроме как использовать KV в конфигурационном файле.
 
 Сообщение отредактировал MrGreen - Суббота, 28.10.2023, 16:43:48 |  |  |  |  |  | 
| _wS_ | Дата: Суббота, 28.10.2023, 17:14:33 | Сообщение # 12 |  |   | Цитата MrGreen (  )  Но что делать с перезагрузкой сервера? Массив тоже пропадет. Я искал информацию много где, но не нашел более адекватного решения проблемы, кроме как использовать KV в конфигурационном файле.Учесть перезагрузку сервера можно так:
 
 x.cfg - основной конфиг, созданный через AutoExecConfig:
 
 
 Код // Здоровье игрока.player_health "110"
 Теперь, если админ изменит player_health через админ-меню на 150, то мы:
 
 1. В нашем глобальном массиве в plugin'е записываем/перезаписываем ключ "player_health" с значением "150" (StringMap хорошо подойдёт).
 
 Эти ключи (квары) с новыми значениями будем хранить в changed_variables.cfg.
 Здесь сразу понимаем, что при старте плагина мы должны 1 раз просканировать changed_variables.cfg и заполнить наш глобальный массив StringMap его данными.
 
 2. Перезаписываем файл changed_variables.cfg всеми данными из нашего глобального массива StringMap.
 
 changed_variables.cfg нигде не подгружается, поэтому после того, как все конфиги были подгружены, делаем:
 
 
 Код public void OnConfigsExecuted(){
 ServerCommand("exec changed_variables.cfg");
 }
 И player_health будет не "110", а "150", т.к. changed_variables.cfg подгрузился позже, чем x.cfg.
 
 ------------
 
 Можно и через KeyValues, как ты сказал.
 Записывать квары и их новые значения в какой-то файл все равно придётся.
 
 ------------
 
 Было бы приятнее перезаписывать сразу тот .cfg файл, в котором переменная указана, но:
 
 
 Код - Есть сложности с поиском такого файла.- Переменная может быть указана в нескольких разных .cfg
 - В этих .cfg могут быть комментарии, которые хотелось бы сохранить.
 Вариант с changed_variables.cfg более простой.
 |  |  |  |  |  | 
| _wS_ | Дата: Суббота, 28.10.2023, 20:57:55 | Сообщение # 13 |  |   | А можно ещё проще: создаём папку changed_variables, в которой имя файла равно имени переменной.Так и никакой StringMap массив не нужен.
 |  |  |  |  |  | 
| MrGreen | Дата: Понедельник, 30.10.2023, 13:39:26 | Сообщение # 14 |  |   
|  |  | Сообщений: 21 Репутация: 0 [ +/- ]
 |  | Цитата _wS_ (  )  А можно ещё проще: создаём папку changed_variables, в которой имя файла равно имени переменной.Так и никакой StringMap массив не нужен.
 Буду иметь ввиду, спасибо большое. Думаю, что мне скоро это пригодится, но сейчас мне сохранять измененные квары куда-то не нужно, их нужно лишь переписать, когда мы настраиваем плагин, то мы правим конфигурационный файл, настраиваем квары, как нам нужно, и когда мы хотим перенастроить его, то снова идем в этот файл и настраиваем. То же самое мне нужно сделать через плагин и все)) И чтобы не создавать много разных файлов для этого, проще использовать KV, но у меня были надежды, что все таки можно напрямую внести изменения в конфигурационный файл, но видимо нельзя. Если только не открывать его, как файл, и по кавычкам вычислять значения, опять получается много циклов, преобразований и т.д.
 
 Сообщение отредактировал MrGreen - Понедельник, 30.10.2023, 13:40:39 |  |  |  |  |  
 |