Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » Серверные Переменные (Как создать, получить, изменить)
Серверные Переменные
_wS_ Дата: Пятница, 13.01.2012, 23:26:53 | Сообщение # 1
Thanks
Создают переменные обычно сразу же после включение скрипта в 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
Thanks
Можете создать файл cstrike/cfg/xz.cfg с вашими переменными, и после того, как они были созданы (CreateConVar) в вашем скрипте, сделать: ServerCommand("exec xz.cfg"); чтобы изменить значения на те, что в вашем xz.cfg.

CreateConVar("x", "1"); выглядит в файле .cfg так:

Code
x "1"
 
Vitaminoz Дата: Среда, 22.01.2014, 19:10:32 | Сообщение # 3
Сообщений: 142
Репутация: 1 [ +/- ]
В каких случаях лучше использовать ServerCommand или SetConVar*
 
TEIN Дата: Среда, 22.01.2014, 19:33:18 | Сообщение # 4
Сообщений: 563
Репутация: 78 [ +/- ]
С помощью SetConVar* можно скрыть уведомление о смене переменной
 
Vitaminoz Дата: Среда, 22.01.2014, 19:42:35 | Сообщение # 5
Сообщений: 142
Репутация: 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
Thanks
Не совсем понял, можно пример какой-нибудь?
Обычно 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
Thanks
Цитата 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
Thanks
Цитата 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
Thanks
А можно ещё проще: создаём папку 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
 
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » Серверные Переменные (Как создать, получить, изменить)
  • Страница 1 из 1
  • 1
Поиск: