Как лучше объявить String Cvar и через значение ";"

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
Подскажите пожалуйста:
1. Как лучше объявить string квар так, что бы после перезагрузке через sm plugins reload квары обновляли своё значение (а то, что в исходнике не ставь - не реагирует)
2. Что бы значения могли идти рандомно или по очереди sm_cvar sm_string "sound/1.mp3; sound/2.mp3; sound/3.mp3;"

При таком объявлении после перезагрузки плагина через консоль значение квара не обновляется

C-подобный:
#pragma semicolon 1
#pragma newdecls required

Handle
    hModel;

char
    sModel[256];

public void OnPluginStart()
{
    hModel = CreateConVar("sm_string", "sound/1.mp3;sound/2.mp3;sound/3.mp3;", "Рандомные треки или модели");
    GetConVarString(hModel, sModel, sizeof(sModel));
    HookConVarChange(hModel, OnConVarChangesModels);
    
    HookEvent("bullet_impact", Event_OnBulletImpact);
}

public void OnConVarChangesModels(ConVar CVar, const char[] oldValue, const char[] newValue)
{
    if(hModel)
    {
        strcopy(sModel, sizeof(sModel), newValue);
    }
}

public void Event_OnBulletImpact(Handle hEvent, const char[] name, bool dontBroadcast)
{
    PrintToChatAll("Квар содержит sModel = [%s]", sModel);
}
 

RusJJ

Доброе утро девачьки
Сообщения
2,582
Реакции
1,075
Вообще ничего не понял.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
а на кой тебе вообще отдельный хэндл для квара?
что бы после перезагрузке через sm plugins reload квары обновляли своё значение
А квар хоть в какой-то конфиг прописаны?
Если нет, то после любой перезагрузки плагина (кроме перезапуска сервера) значение квара не поменяется, емнип

В общем я бы сделал примерно так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

char sModel[PLATFORM_MAX_PATH];

public void OnPluginStart()
{
    ConVar cvar = CreateConVar("sm_string", "sound/1.mp3;sound/2.mp3;sound/3.mp3", "Рандомные треки или модели", FCVAR_PRINTABLEONLY);
    cvar.GetString(sModel, sizeof(sModel));
    HookConVarChange(cvar, OnConVarChangesModels);

    HookEvent("bullet_impact", Event_OnBulletImpact);

    AutoExecConfig(true, "my_pretty_config");
}

public void OnConVarChangesModels(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    cvar.GetString(sModel, sizeof(sModel));
}

public void Event_OnBulletImpact(Handle hEvent, const char[] name, bool dontBroadcast)
{
    PrintToChatAll("Квар содержит sModel = [%s]", sModel);
}
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,042
Реакции
2,295
а на кой тебе вообще отдельный хэндл для квара?
Сообщения автоматически склеены:
Да ктож его знает, объясни как лучше, я же и говорю, что как то не так всё как надо..
Вообще ничего не понял.
Необходимо, что бы после перезагрузки плагина изменения сразу вступали в силу, а не требовалась бы отдельно sm_cvar изменять переменную.
Необходимо, что бы квар string был не просто "1.mp3", а "1.mp3;2.mp3;3.mp3" и рандомно(или по очереди) воспроизводил
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@Nekro, чтобы рандомно и/или по очереди воспроизводил, это нуно в каллбэке хука заносить все значения в массив, а потом из массива случайным образом брать когда нуно использовать какое-то значение.
А т.к. у нас тут пути к файлам то имеет смысл использовать файл конфига и KeyValues (в конфиге, в самом плагине значения можно хранить и в ArrayList), а не ConVar и char, т.к. 256 символов может не хватить у текстовой переменной, да и брать оттуда случайное значение несколько проблематично.
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
Необходимо, что бы после перезагрузки плагина изменения сразу вступали в силу, а не требовалась бы отдельно sm_cvar изменять переменную.

После создания квара, он не удаляется и навсегда остаётся в памяти до перезагрузки сервера.
Чтобы квар изменял значение при перезагрузке плагина, нужно:
- либо использовать AutoExecConfig, как показал Grey83, при этом значение квара менять в конфиг файле cfg/sourcemod/ ...
- либо принудительно обновлять его к дефолту через cvar.RestoreDefault(true, false);

Для хранения путей к трекам самое простое - это завести обычный текстовой файл, по одному пути на строку.
И читать через что-то вроде:
C-подобный:
void ReadConfig()
{
	char sConfig[PLATFORM_MAX_PATH];
	static char sPath[PLATFORM_MAX_PATH];
	ArrayList al = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH));
	
	BuildPath(Path_SM, sConfig, sizeof(sConfig), "data/tracks.txt");
	
	File hFile = OpenFile(sConfig, "r");
	if( hFile == null )
	{
		LogError("Failed to open \"%s\".", sConfig);
		return;
	}
	
	while( !hFile.EndOfFile() && hFile.ReadLine(sPath, sizeof(sPath)) )
	{
		TrimString(sPath);
		if( FileExists(sPath) )
		{
			al.PushString(sPath);
		}
	}
}

void GetRandomTrack()
{
	if( al.Length == 0 )
	{
		ReadConfig();
	}
	if( al.Length != 0 )
	{
		static char sPath[PLATFORM_MAX_PATH];
		int idx = GetRandomInt(0, al.Length - 1);
		al.GetString(idx, sPath, sizeof(sPath));
		PrintToServer(sPath);
		al.Erase(idx); // без повторов!
	}
}
Но с учётом, что может захотеться иметь ещё и имена треков и т.п., вариант KeyValues конфига выглядит аппетитней.
 
Последнее редактирование:
Сверху Снизу