Серверные Переменные
| |
_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 |
|
| |
|