Выбор случайного конфига для карты

pokypka20

Участник
Сообщения
244
Реакции
31
Есть конфиг в котором названия sky_name, можно ли сделать так чтобы каждая текстурка при смене карты случайным образом устанавливалась.
Тоесть конфиг sky_name.txt
sky_day1
sky_day2
и т.д

При смене карты выбирается один вариант и включается, как такое можно реализовать?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
pokypka20, рандом. Давали уже много примеров и еще я где-то тут реализацию похожего писал. Пора бы уже самому что-то ковырять.

И да, харе создавать новые темы, задавай все вопросы в одной теме.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Давали уже много примеров
Верно. Пишешь файл, в каждой новой строке - новый путь (текстура). Далее используешь рандом от 1 до числа последней строки. Через while считываешь строки, нужная строка (рандома) - и есть твоя текстура.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Проще считать все строки
PHP:
public OnMapStart()
{
	new Handle:file = OpenFile("cfg/sky_name.txt", "r");
	if (file == INVALID_HANDLE) SetFailState("Не удалось открыть cfg/sky_name.txt!");
	else
	{
		new random = GetRandomInt(1, 5);
		decl String:path[200];
		while (random && !IsEndOfFile(file) && ReadFileLine(file, path, sizeof(path))) random--;
	}
	CloseHandle(file);
}
Сильно сложно? :)
Даже !IsEndOfFile(file) не обязателен - это так, на всякий случай вписал, если ТС что "попортит". :acute:
if (file == INVALID_HANDLE) SetFailState("Не удалось открыть cfg/sky_name.txt!"); тоже можно убирать, но не желательно, особенно саму проверку.
А у твоего варианта, я так понял, все строки хранятся в SM и цикл всегда 100%.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
AlmazON, из-за человеческой глупости предпочитаю безопасный код, а то скажешь что надо вписать кол-во строк и начнется: - а как это? - а что это? - как? - а куда? - а можешь сделать? И в итоге все ровно напартачат, поэтому лучше предохраняться.


Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
из-за человеческой глупости предпочитаю безопасный код
Хорошо. Вот код, который минимально использует цикл и требует лишь 1 вместилище для 1 строки (вместо целого массива индексов):
PHP:
public OnMapStart()
{
	new Handle:file = OpenFile("cfg/sky_name.txt", "r");
	if (file == INVALID_HANDLE) SetFailState("Не удалось открыть cfg/sky_name.txt!");
	else
	{
		static m;
		new random = GetRandomInt(0, (m > 0 ? m:-m)), r = random;
		decl String:path[200];
		while (!IsEndOfFile(file) && ReadFileLine(file, path, sizeof(path)) && --r){}
		if (r) m = random-r;
	}CloseHandle(file);
}
Поскольку на месте максимума всё равно был бы квар/константа, то такой код почти также нагружает сервер, как и предыдущий, но умеет сам определять максимум строк в файле + может обновляться (пусть и не каждый раз).
К тому же, по идее, в нём чаще будут читаться первая и последняя строчки, что в обычном рандоме получается реже.
 
Последнее редактирование:

pokypka20

Участник
Сообщения
244
Реакции
31
Спасибо, старался не вмешиваться в ваш разговор ждал релизного ответа :D
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
релизного ответа
Во-первых, я там {} забыл, так что сразу высчитает неверно + при обновлении списка, когда он уменьшается часто будет выбирать последнюю позицию. Это была скорее альфа-версия)
Сейчас сделал релиз, смотри выше.
Вообще, по сути, можно сделать команду обновления списка текстур, когда это необходимо.
 
Последнее редактирование:
Сверху Снизу